在c++中处理UTF-8
Handling UTF-8 in C++
为了确定c++是否适合我的一个项目,我想测试一下UTF-8功能。根据参考资料,我构建了这个示例:
#include <string>
#include <iostream>
using namespace std;
int main() {
wstring str;
while(getline(wcin, str)) {
wcout << str << endl;
if(str.empty()) break;
}
return 0;
}
但是当我输入一个UTF-8字符时,它会出错:
$ > ./utf8
Hello
Hello
für
f
$ >
不仅不打印ü
,而且立即退出。gdb
告诉我飞机没有坠毁,只是正常出口,但我觉得很难相信。
在Linux上不要使用wstring
std::wstring VS std::string
看一下第一个答案。我相信它回答了你的问题。
在Linux上
- 当我应该使用std::wstring std::string?
?几乎从不(§)。
Windows上的?几乎总是(§)。
语言本身与unicode或任何其他字符编码无关。它与操作系统有关。Windows使用UTF16作为unicode支持,这意味着使用宽字符(16位宽字符)- wchar_t或std:wstring。每个使用字符串操作的Win Api函数都需要宽字符输入。
但是基于unix的系统,如Mac OS X或Linux使用UTF8。当然,这只是你如何处理数组中的字节的问题,所以你可以将UTF16字符串存储在普通的C数组或std:string容器中。这就是为什么你在跨平台代码中看不到任何字符串;相反,所有字符串都作为UTF8处理,并在必要时重新编码为UTF16(在windows上)。
你有更多的选择如何处理这个有点令人困惑的东西。我个人就像上面提到的那样——在所有应用程序中严格使用UTF8编码,在与Windows Api交互时重新编码字符串,并直接在Mac OS x上使用它们。对于win重新编码,我使用了很棒的转换助手:
c++ UTF-8转换帮助程序(在MSDN上,在Apache许可证2.0版下可用)。
你也可以使用跨平台Qt String定义UTF8到UTF16和其他编码(ANSI, Latin…)之间的转换函数。
所以上面的答案-在unix上总是使用UTF8 (std::string, char),在Windows上UTF16 (std::wstring, wchar_t)是正确的
请记住,在启动主程序时,默认选择"C"区域设置。如果处理utf-8,您可能不希望这样。调用setlocale(LC_CTYPE, "")
将关闭此默认值,并且您将获得在环境中定义的任何内容(假设是utf-8区域设置)。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- HEX值到wchar_t字符(UTF-8)的转换
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 如何正确处理渲染大小为 >= 2B 的 utf-8 字符?
- 如何在 c++ STL 文件读取期间可移植地捕获和处理 UTF "EN DASH"缺点?
- 处理 UTF-8 字符串
- C++处理UTF-8问题
- 在c++中处理UTF-8
- 用c++处理来自MySQL的utf-8数据并返回结果
- 处理std::wstring和std::string之间的UTF-8编码字符串
- TagLib -如何处理UTF-8编码的文件路径