2012-03-15 51 views
7

我在试图理解不同的编码方面有几个问题。C/C++编码问题

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

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? 

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

我的问题主要针对Windows,但如果它在不同的操作系统上有所不同,我很想知道。

回答

9

该标准没有指定窄字符串或宽字符串的编码。供应商通常会瞄准目标机器上并不令人意外的事情,但很难多说。这意味着,例如,窄字符串可能在大多数个人计算机上使用ASCII(或者,实际上类似于ISO-8859),但在IBM大型机上使用EBCDIC。

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

提到的MessageBox暗示Windows,其中(正如你所猜测的),你通常会使用宽字符串的UTF-16。在这种情况下,如果明确指定宽字符串,则还需要明确指定函数的宽版本 - MessageBoxW

就创建一个UTF-8字符串文字而言,我所能说的只是“祝你好运”。 Visual Studio会这样做,但如果有办法让它做到这一点,我不知道它。

+2

C++ x11为UTF-8字符串文字添加了一个'u8'前缀,例如:'u8“Hello World”',但是直到C++ x11被C++编译器厂商采用,你只需要编码UTF -8字符串来代替。例如,在运行时使用具有代码页65001的'WideCharToMultiByte()',或在编译时使用包含UTF-8八位字节值的'char []'文字。 – 2012-03-15 19:20:27