wchar_t和编码

时间:2012-05-03 21:38:18

标签: c++ character-encoding wchar-t

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

wchar_tchar如何与UTF-8或UTF-16或UTF-32或其他转换格式相关?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

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

关于wchar_t:标准说

  

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

不幸的是,它没有说明编码wchar_t应该具有什么;这是依赖于实现的。所以例如给出

auto s = L"foo";

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

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

答案 1 :(得分:4)

iconv是一个POSIX函数,可以处理中间编码步骤。您可以使用iconv_open指定您具有UTF-8输入并且您想要UTF-16输出。然后,使用从iconv_open返回的句柄,您可以使用iconv(指定输入缓冲区和输出缓冲区)。完成后,您必须在iconv_close返回的句柄上调用iconv_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);

答案 2 :(得分:1)

wchar_t的大小取决于编译器,因此它与各种unicode格式的关系会有所不同。