首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >十六进制代码(\x)和unicode (\u)字符有什么区别?

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

Stack Overflow用户
提问于 2015-10-29 21:19:45
回答 1查看 20.3K关注 0票数 31

来自?Quotes

具有给定十六进制代码的

\xnn字符(1或2个十六进制数字) \unnnn具有给定代码的Unicode字符(1--4个十六进制数字)

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

代码语言:javascript
复制
"\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下,当尝试打印井号时,我看到

代码语言:javascript
复制
cat("\ua3")
## £
cat("\xa3")
## �

也就是说,\x十六进制代码无法正确显示。(这种行为在我尝试过的任何语言环境中都会持续存在。)在Windows7下,两个版本都显示了一个井号。

如果我将其转换为整数并返回,那么在Linux下井号将正确显示。

代码语言:javascript
复制
cat(intToUtf8(utf8ToInt("\xa3")))
## £

顺便说一句,这在Windows下是行不通的,因为utf8ToInt("\xa3")返回NA

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

代码语言:javascript
复制
utf8ToInt("\xf0")
## Error in utf8ToInt("\xf0") : invalid UTF-8 string

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

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

这两种字形有什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-29 22:36:25

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

代码语言:javascript
复制
> charToRaw('\xA3')
[1] a3
> charToRaw('\uA3')
[1] c2 a3

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

代码语言:javascript
复制
> '\ua3\xa3'
Error: mixing Unicode and octal/hex escapes in a string is not allowed

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

代码语言:javascript
复制
> Encoding('\xa3')
[1] "unknown"
> Encoding('\ua3')
[1] "UTF-8"

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

在Linux上,您的控制台可能期望使用

  • -8文本,而由于0xA3不是有效的UTF-8序列,它会给您提供“windows1252”。

  • On Windows,您的控制台可能期望使用�-1252文本,而0xA3是“‘s”的正确编码,这就是您所看到的。(当字符串为\uA3时,将发生从UTF8到Windows-1252的转换。)

如果显式设置了编码,则会在Linux上进行相应的转换:

代码语言:javascript
复制
> s <- '\xa3'
> Encoding(s) <- 'latin1'
> cat(s)
£
票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33415388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档