我最近有一个奇怪的bugreport。
问题是以下代码在某些计算机上生成了不完整的UTF8字符:
#include <iostream>
#include <sstream>
int main() {
std::cout.imbue(std::locale("fr_FR.UTF-8"));
std::cout << 1337;
}
在我的机器上,此输出为“ 1 337”或十六进制(通过hexdump)为“ 2031 3333 0037”。但是在有错误的人的机器上,十六进制输出为“ e231 3333 0037”。
“ e2”是zero width non joiner的开始,在UTF-8中是e2 80 af
。
这怎么可能?据我了解,特殊字符是比常规空格更好的数字分隔符,但是为什么C ++(?)无法完全打印出来呢?
十六进制输出由./a.out | hexdump
收集,因此控制台编码无关紧要。