6

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

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

提前感谢您的帮助!

4

3 回答 3

5

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

关于wchar_t:标准说

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

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

auto s = L"foo";

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

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

于 2012-05-03T22:10:56.650 回答
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);
于 2012-05-03T22:24:50.160 回答
1

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

于 2012-05-03T22:03:33.447 回答