【问题标题】:Converting UTF-8 hex to Unicode hex将 UTF-8 十六进制转换为 Unicode 十六进制
【发布时间】:2023-08-26 09:34:01
【问题描述】:

我有诸如“flamenguistas e s\xc3a3o paulinos”之类的字符串,以这种方式包含 UTF-8 代码“\xc3a3”。我如何把它变成字母“ã”?

我遇到了麻烦,因为大多数用于取消转义的函数都期望代码是 Unicode,而我无法找到将 UTF-8 十六进制转换为 Unicode 十六进制的正确方法。

除了编写从表中读取的函数并进行转换之外,是否有一种简单的方法可以将 UTF-8 十六进制转换为 Unicode 十六进制?

附:当我说“Unicode hex”/“UTF-8 hex”时,我的意思是:https://en.wikipedia.org/wiki/%C3%87#Computer

【问题讨论】:

  • 如果您提供显示此类字符串定义的实际代码会有所帮助。简单的原因是,有多个地方可以逃避或解释事物。有代码,不需要解释,所以举一个例子说明你有什么和你需要什么。作为对新用户的一般建议,请使用tour 并阅读How to Ask
  • "\xc3a3" 似乎很奇怪。你确定它不是“\xc3\xa3”吗?这只是字节的“转储到字符串”呈现吗?即字符串是否包含反斜杠和x,还是包含值为c3(十六进制)的字节?

标签: r string unicode utf-8


【解决方案1】:

看起来 R 支持 PCRE 正则表达式。您可以移植以下替换。

hex 函数接受一串十六进制数字并将其转换为数字。 chr 函数接受一个数字并将其转换为一个字符。点运算符是字符串连接。整个结果由 UTF-8 编码的八位字节组成。

#!/usr/bin/env perl
$_ = <<'';
flamenguistas e s\xc3a3o paulinos

s|
    \\x             # literal \x
    (               # capture into $1
        [0-9a-f]    # hex digits
        {2}         # exactly two times
    )
    (               # capture into $2
        [0-9a-f]
        {2}
    )
|
    chr(hex($1)) . chr(hex($2))
|egmsx;

print; # flamenguistas e são paulinos

【讨论】: