来自?Quotes
具有给定十六进制代码的
\xnn字符(1或2个十六进制数字) \unnnn具有给定代码的Unicode字符(1--4个十六进制数字)
在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
十六进制代码无法正确显示。(这种行为在我尝试过的任何语言环境中都会持续存在。)在Windows7下,两个版本都显示了一个井号。
如果我将其转换为整数并返回,那么在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
字符形式之间的一些差异,这些字符似乎是特定于操作系统的,但我看不出它们是如何定义的任何逻辑。
这两种字形有什么不同?
发布于 2015-10-29 22:36:25
转义序列\xNN
将原始字节NN
插入字符串,而\uNN
将Unicode代码点NN
的UTF-8字节插入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
将其保留为默认的“未知”(也称为“未知”)。原生)编码:
> Encoding('\xa3')
[1] "unknown"
> Encoding('\ua3')
[1] "UTF-8"
这在打印字符串时变得很重要,因为它们需要转换为适当的输出编码(例如,控制台的输出编码)。具有已定义编码的字符串可以进行适当的转换(请参阅enc2native
),但具有“未知”编码的字符串将按原样输出:
在Linux上,您的控制台可能期望使用
0xA3
不是有效的UTF-8序列,它会给您提供“windows1252”。
0xA3
是“‘s”的正确编码,这就是您所看到的。(当字符串为\uA3
时,将发生从UTF8到Windows-1252的转换。)如果显式设置了编码,则会在Linux上进行相应的转换:
> s <- '\xa3'
> Encoding(s) <- 'latin1'
> cat(s)
£
https://stackoverflow.com/questions/33415388
复制相似问题