【发布时间】:2021-12-17 11:57:57
【问题描述】:
所以,这里有一些简单的代码来重新创建我的问题:
#include <cstdio>
const char* badString = u8"aš𒀀";
const char* anotherBadString = u8"\xef\x96\xae\xef\x96\xb6\x61\xc5\xa1\xf0\x92\x80\x80";
const char* goodString = "\xef\x96\xae\xef\x96\xb6\x61\xc5\xa1\xf0\x92\x80\x80";
void printHex(const char* str)
{
for (; *str; ++str)
{
printf("%02X ", *str & 0xFF);
}
puts("");
}
int main(int argc, char *argv[])
{
printHex(badString);
printHex(anotherBadString);
printHex(goodString);
return 0;
}
我希望所有这些字符串都打印出相同的结果,EF 96 AE EF 96 B6 61 C5 A1 F0 92 80 80 。但是,在 MSVC 2019 中,前两个字符串会打印出 C3 AF C2 96 C2 AE C3 AF C2 96 C2 B6 61 C3 85 C2 A1 C3 B0 C2 92 C2 80 C2 80。这似乎是由于额外时间编码为 UTF-8 造成的。
我在other threads 中读到,解决此问题的方法是将/utf-8 标志添加到项目中,但我已经尝试过了,但没有任何区别。这里有什么我不理解的更基本的东西吗?
非常感谢!
【问题讨论】:
-
我必须承认,您暴露的
goodString是我真正信任的唯一形式。它仅基于 ASCII 字符(不是编码的内容,而是它在源代码文件中的存储方式)。如果此类文件与不同平台上的不同编辑器和工具一起使用,则这些工具都不会对其内容造成任何损害。由于我对此的偏执,我什至使用八进制序列而不是十六进制,因为前者限制为 3 位,后者可能有 2 位或更多位。因此,如果十六进制序列与任意 ASCII 字符(我的意思是非十六进制序列)混合,后者可能会中断。
标签: c++ string visual-c++ encoding