MSVC调试器显示UTF 8中文字符串 | Blurred code

MSVC调试器显示UTF 8中文字符串

2022/04/12

LastMod:2022/04/12

Categories: win32

C++20以前没有std::u8string,虽然msvc有一个扩展(/Zc:char8_t-)可以用,但是最好别碰(https://docs.microsoft.com/en-us/cpp/build/reference/zc-char8-t?view=msvc-170)。 那个扩展允许写出这种代码,第一条是扩展的内容,这个扩展和c++二十加进来的u8符号是不兼容的,会导致升级编译器的时候出现break change。

const char* str = u8"hello中国"; // error in cpp20
const char8_t* str = u8"hello中国"; //valid in cpp20

目前最好的方案还是通过/utf-8标志指定MSVC编译器把代码里的字符串都当做utf-8处理,并且代码都保存在utf-8格式。

但是std::string并不包含encoding信息,所以MSVC的debugger不知道std::string里的编码文字,其会把里面的文字尝试用locale所在的编码解释,中文的话会是GBK编码。

edit-260f74663c9242eca6771776420b4205-2022-04-12-22-09-55

如果想要在调试器里看到UTF-8编码的中文的中文字符串,可以在Variables面板右键点击字符串添加到watch面板,并且在watch面板的变量后面加上s8标志,指示这是一个u8string。UTF16字符串可以用su标志,不过应该用的比较少,在Windows平台用宽字符串std::wstring存储utf-16的字符串的话调试器应该能正确识别。

所有调试器可以用的格式化标志可以见(https://docs.microsoft.com/en-us/visualstudio/debugger/format-specifiers-in-cpp?view=vs-2022),包含很多高级的格式化标记。

以上操作在Windows平台上可以对Visual StudioVisual Studio Code起效。