如果我想将一段字符串转换为UTF-16,比如char * xmlbuffer
,我是否必须在编码为UTF-16之前将类型转换为wchar_t *
?在编码为UTF-8之前是否需要char*
类型?
wchar_t
,char
如何与UTF-8或UTF-16或UTF-32或其他转换格式相关?
提前感谢您的帮助!
答案 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格式化功能:MultiByteToWideChar和WideCharToMultiByte。
//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格式的关系会有所不同。