Objective-C NSLog与Node.js console.log打印特殊字符结果不同的原因?
为什么Objective-C和Node.js输出
\xc2\xbfhello的结果不一样? 这个问题的核心根源,是两种语言对字符串字面量中\x十六进制转义的处理规则完全不同,咱们拆解来看:
1. Objective-C的处理逻辑
在Objective-C中,字符串字面量(@"...")的底层是基于UTF-8字节序列来创建NSString对象的:
- 你写的
\xc2\xbf是两个独立的十六进制字节(0xC2和0xBF),编译器会把它们当作UTF-8编码的字节流。 - 而
0xC2 0xBF恰好是Unicode字符¿(倒置问号,U+00BF)的UTF-8编码。 - 所以
NSLog输出时,会正确解码这两个字节为¿,最终输出结果是:¿hello。
2. Node.js的处理逻辑
Node.js(基于JavaScript)的字符串是Unicode字符序列,对\x转义的规则完全不同:
- JavaScript里的
\xXX转义表示的是单个Latin-1(ISO-8859-1)字符,其中XX是两位十六进制数,对应Unicode码点U+00XX。 - 所以
\xc2会被解析为Unicode字符Â(U+00C2),\xbf则是¿(U+00BF)。 - 最终
console.log输出的是这两个字符拼接上hello,也就是:¿hello。
简单总结:Objective-C把\xc2\xbf当作UTF-8字节对解码成单个Unicode字符,而Node.js把它们当作两个独立的Latin-1字符处理,这就是输出差异的本质。
内容的提问来源于stack exchange,提问作者elsonwx
相关产品推荐
相关产品推荐

