C/C++编码问题

Jos*_*osh 7 c++ string unicode encoding

我在尝试理解不同的编码时遇到了一些问题.

字符串的默认编码是什么?

char ascii[]= "Some text"; // This is plain ASCII right?
wchar_t utf[] = L"Some Text"; // Is this UTF-16? Or ASCII stored in wchar_t's?
MessageBoxW(NULL, L"Hello", L"HI", MB_OK); // What encodings are the 2 strings in?
Run Code Online (Sandbox Code Playgroud)

然后,我将如何创建UTF-8字符串?如果我想在MessageBox中显示UTF-8字符?

我的问题主要针对Windows,但如果在不同的操作系统上有所不同,我有兴趣知道.

Jer*_*fin 9

该标准未指定窄字符串或宽字符串的编码.供应商通常会在目标机器上瞄准一些不足为奇的东西,但很难说更多.这意味着,例如,窄字符串可能在大多数个人计算机上使用ASCII(或者,实际上类似于ISO-8859),但在IBM大型机上使用EBCDIC.

宽字符串也有所不同 - 例如,Windows上的大多数编译器都使用UTF-16.在Linux上,UTF-32/UCS-4可能更常见.

提到MessageBoxWindows,其中(正如你猜测的那样)你通常会有宽字符串的UTF-16.在这种情况下,如果明确指定宽字符串,则还需要显式指定函数的宽版本 - MessageBoxW.

至于创建一个UTF-8字符串文字,我能说的就是"祝你好运".这将取决于Visual Studio,但如果有办法让它做到这一点,我不知道它.

  • C++ x11为UTF-8字符串文字添加了一个`u8`前缀,例如:`u8"Hello World"`,但是在C++编译器供应商采用C++ x11之前,你只需编码UTF-8字符串手动而不是.例如,在运行时使用带有代码页65001的`WideCharToMultiByte()`,或者在编译时使用包含UTF-8八位字节值的`char []`文字. (2认同)