wchar_t和编码

Hun*_*ter 6 c++ wchar-t character-encoding

如果我想将一段字符串转换为UTF-16,比如说char * xmlbuffer,我是否必须wchar_t *在编码之前将类型转换为UTF-16?char*在编码为UTF-8之前是否需要输入类型?

怎么样wchar_t,char与UTF-8或UTF-16或UTF-32或其他转换格式有关?

在此先感谢您的帮助!

Jon*_*Jon 5

不,您不必更改数据类型。

关于wchar_t:标准指出

wchar_t类型是一种独特的类型,其值可以代表在支持的语言环境中指定的最大扩展字符集的所有成员的独特代码。

不幸的是,它没有说wchar_t应该使用什么编码。这取决于实现。所以举个例子

auto s = L"foo";
Run Code Online (Sandbox Code Playgroud)

您绝对不能假设表达式的值是什么*s

但是,您可以使用a std::string作为不透明的字节序列,以您选择的任何转换格式表示文本而不会出现问题。只是不要对它执行与标准库字符串相关的操作。


dre*_*lax 5

iconv是一个 POSIX 函数,可以处理中间编码步骤。您可以使用iconv_open来指定您有 UTF-8 输入并且您想要 UTF-16 输出。然后,使用从 返回的句柄iconv_open,您可以使用iconv(指定您的输入缓冲区和输出缓冲区)。完成后,您必须调用iconv_closeiconv_open释放资源等返回的句柄。

您必须仔细阅读系统文档,了解支持哪些编码iconv及其命名方案(即要提供的内容iconv_open)。例如,iconv在某些系统上期望"utf-8"和其他系统可能期望"UTF8"等。

Windows 不提供 iconv 的版本,而是提供它自己的 UTF 格式化函数:MultiByteToWideCharWideCharToMultiByte

//UTF8 to UTF16
std::string input = ...
int utf16len = MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
                                               NULL, 0);
std::wstring output(utf16len);
MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
                                &output[0], output.size());
//UTF16 to UTF8
std::wstring input = ...
int utf8len = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
                                              NULL, 0, NULL, NULL);
std::string output(utf8len);
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(),
                                &output[0], output.size(), NULL, NULL);
Run Code Online (Sandbox Code Playgroud)