Lan*_*nbo 12 c++ linux stl utf-8 wstring
要了解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;
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入一个UTF-8字符时,它行为不端:
$ > ./utf8
Hello
Hello
für
f
$ >
Run Code Online (Sandbox Code Playgroud)
它不仅不会打印ü,而且会立即退出.gdb告诉我没有崩溃,但正常退出,但我发现很难相信.
小智 10
不要在Linux上使用wstring.
std :: wstring VS std :: string
看看第一个答案.我相信它会回答你的问题.
- 什么时候我应该使用std :: wstring而不是std :: string?
在Linux上?几乎从不 (§).
在Windows上?几乎总是 (§).
vit*_*kot 10
语言本身与unicode或任何其他字符编码无关.它与操作系统有关.Windows使用UTF16支持unicode,这意味着使用宽字符(16位宽字符) - wchar_t或std:wstring.每个使用字符串操作的Win Api函数都需要宽字符输入.
但基于unix的系统,即Mac OS X或Linux使用UTF8.当然 - 这只是你如何处理数组中的字节的问题,因此你可以将UTF16字符串存储在公共C数组或std:string容器中.这就是为什么你没有在跨平台代码中看到任何wstrings; 相反,所有字符串都作为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)上是真的.
| 归档时间: |
|
| 查看次数: |
11880 次 |
| 最近记录: |