gpt4 book ai didi

r - 十六进制代码 (\x) 和 unicode (\u) 字符有什么区别?

转载 作者:行者123 更新时间:2023-12-02 03:28:27 25 4
gpt4 key购买 nike

来自?引用:

\xnn   character with given hex code (1 or 2 hex digits)  
\unnnn Unicode character with given code (1--4 hex digits)

在 Unicode 字符只有一位或两位数字的情况下,我希望这些字符是相同的。事实上,?Quotes 帮助页面上的示例之一显示:

"\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21"
## [1] "Hello World!"
"\u48\u65\u6c\u6c\u6f\u20\u57\u6f\u72\u6c\u64\u21"
## [1] "Hello World!"

但是,在 Linux 下,当尝试打印井号时,我看到了

cat("\ua3")
## £
cat("\xa3")
## �

\x十六进制代码无法正确显示。 (在我尝试过的任何区域设置中,此行为都持续存在。)在 Windows 7 下,两个版本都显示井号。

如果我转换为整数然后再转换回来,则井号在 Linux 下会正确显示。

cat(intToUtf8(utf8ToInt("\xa3")))
## £

顺便说一句,这在 Windows 下不起作用,因为 utf8ToInt("\xa3") 返回 NA

某些\x字符在Windows下返回NA,但在Linux下抛出错误。例如:

utf8ToInt("\xf0")
## Error in utf8ToInt("\xf0") : invalid UTF-8 string

("\uf0" 是有效字符。)

这些示例表明 \x\u 形式的字符之间存在一些差异,这似乎是特定于操作系统的,但我看不到任何差异它们的定义方式的逻辑。

这两种字符形式有什么区别?

最佳答案

转义序列 \xNN 将原始字节 NN 插入到字符串中,而 \uNN 则插入 Unicode 的 UTF-8 字节将代码点 NN 转换为 UTF-8 字符串:

> charToRaw('\xA3')
[1] a3
> charToRaw('\uA3')
[1] c2 a3

这两种类型的转义序列不能混合在同一个字符串中:

> '\ua3\xa3'
Error: mixing Unicode and octal/hex escapes in a string is not allowed

这是因为转义序列还定义了字符串的编码\uNN 序列显式地将整个字符串的编码设置为“UTF-8”,而 \xNN 将其保留为默认的“未知”(也称为 native )编码:

> Encoding('\xa3')
[1] "unknown"
> Encoding('\ua3')
[1] "UTF-8"

这在打印字符串时变得很重要,因为它们需要转换为适当的输出编码(例如,控制台的编码)。具有已定义编码的字符串可以进行适当转换(请参阅enc2native),但具有“未知”编码的字符串只是按原样输出:

  • 在 Linux 上,您的控制台可能需要 UTF-8 文本,并且由于 0xA3 不是有效的 UTF-8 序列,因此它会为您提供“�”。
  • 在 Windows 上,您的控制台可能需要 Windows-1252 文本,并且由于 0xA3 是“£”的正确编码,这就是您所看到的。 (当字符串为 \uA3 时,会发生从 UTF-8 到 Windows-1252 的转换。)

如果显式设置编码,则 Linux 上将进行适当的转换:

> s <- '\xa3'
> Encoding(s) <- 'latin1'
> cat(s)
£

关于r - 十六进制代码 (\x) 和 unicode (\u) 字符有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33415388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com