wchar_t and encoding
wchar_t and encoding
如果我想将一段字符串转换为 UTF-16,比如char * xmlbuffer
,在编码为 UTF-16 之前,我是否必须将类型转换为 wchar_t *
?在编码为 UTF-8 之前是否需要char*
类型?
wchar_t
、char
与 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 格式的关系会有所不同。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- QNetworkRequest and QUrl encoding c++
- wchar_t and encoding