wchar_t and encoding

wchar_t and encoding

本文关键字:encoding and wchar      更新时间:2023-10-16

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

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

提前感谢您的帮助!

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

关于wchar_t:标准说

类型 wchar_t 是一种非重复类型,其值可以表示不同的 指定的最大扩展字符集的所有成员的代码 在支持的区域设置中。

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

auto s = L"foo";

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

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

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

您必须仔细阅读系统的文档,了解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);

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