我读过并听说C++ 11支持Unicode.关于这一点的一些问题:
std::string做自己应该?我见过C++社区中的很多人(特别是freenode上的## c ++)对windows api 的使用wstrings和使用感到不满wchar_t.究竟是什么"错误"有wchar_t和wstring,如果我要支持国际化,有一些什么替代宽字符?
我想知道Stack Overflow社区在使用unicode或多字节字符集创建项目(主要考虑c ++)时的想法.
从一开始就直接使用Unicode是否有优势,这意味着您的所有字符串都将采用宽格式?由于标准使用较大的字符,是否存在性能问题/更大的内存要求?
这种方法有优势吗?某些处理器架构能否更好地处理宽字符?
如果您不打算支持其他语言,是否有任何理由使您的项目成为Unicode?
创建具有多字节字符集的项目有什么理由?
上述所有因素如何在高性能环境(例如现代视频游戏)中发生冲突?
我正在寻找关于如何使用ICU的简单实用的C++示例.
ICU主页在这方面没有帮助.
我对Unicode的原因和原因不感兴趣.
少数演示不是自包含的,不是可编译的例子(包含在哪里?)
我正在寻找类似'Hello,World'的内容:
如何打开和读取以UTF-8编码的文件
如何使用STL/Boost字符串函数来操作UTF-8编码的字符串等.
如果我有UTF-8 std::string怎么把它转换成UTF-16 std::wstring?实际上,我想比较两个波斯语.
我知道已经有StackOverflow上有关的几个问题std::string与std::wstring或类似,但没有人提出了一个完整的解决方案.
为了获得一个好的答案,我应该定义要求:
CFStringRef,wchar_t *,char*为UTF-8或其他类型的,因为它们是由OS API必需的.备注:我不需要代码页转换支持,因为我希望在所有支持的操作系统上只使用Unicode兼容的函数.我非常感谢每个答案只提出一个解决方案,通过这样做,人们可以投票选择他们喜欢的替代方案.如果您有多个替代方案,请添加另一个答案.
请说明一些对你有用的东西.
相关问题:
我在弄清楚确切的语义时遇到了一些麻烦std::string.length().该文件明确指出,length()返回字符的字符串中而且数量不是字节数.我想知道在哪些情况下这实际上有所作为.
特别是,这只与非char实例化相关,std::basic_string<>或者在存储具有多字节字符的UTF-8字符串时是否也会遇到麻烦?标准是否允许length()UTF8感知?
我看到Visual Studio 2008及更高版本现在开始使用字符集设置为Unicode的新解决方案.我的旧C++代码只处理英文ASCII文本,并且满是:
"Hello World"char 类型char * 指向已分配的C字符串的指针STL string 类型转换STL string为C字符串,反之亦然,使用STL string构造函数(接受const char *)和STL string.c_str()
我需要对迁移此代码进行哪些更改,以便它在Visual Studio Unicode和Unicode启用的库的生态系统中工作?(我不需要它同时使用ASCII和Unicode,它可以是纯Unicode.)
是否也可以以独立于平台的方式执行此操作?(即,不使用Microsoft类型.)
我看到很多广泛的字符和Unicode类型和转换散落在周围,因此我的困惑.(例如:wchar_t,TCHAR,_T,_TEXT,TEXT等)
要了解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告诉我没有崩溃,但正常退出,但我发现很难相信.
流行的软件开发人员和公司(Joel Spolsky,Fog Creek软件)在编写C或C++代码时倾向于使用wchar_t进行Unicode字符存储.何时以及如何在良好的编码实践中使用char和wchar_t?
在编写利用Unicode的软件时,我对POSIX合规性特别感兴趣.
使用wchar_t时,您可以在每个字符或每个数组元素的基础上查找宽字符数组中的字符:
/* C code fragment */
const wchar_t *overlord = L"ov€rlord";
if (overlord[2] == L'€')
wprintf(L"Character comparison on a per-character basis.\n");
Run Code Online (Sandbox Code Playgroud)
如何在使用char时比较unicode字节(或字符)?
到目前为止,我在C 中比较字符串和char类型字符的首选方法通常如下所示:
/* C code fragment */
const char *mail[] = { "ov€rlord@masters.lt", "ov€rlord@masters.lt" };
if (mail[0][2] == mail[1][2] && mail[0][3] == mail[1][3] && mail[0][3] == mail[1][3])
printf("%s\n%zu", *mail, strlen(*mail));
Run Code Online (Sandbox Code Playgroud)
此方法扫描等效字节的字节.Unicode欧元符号€占用3个字节.因此,需要比较三个char数组字节以了解Unicode字符是否匹配.通常,您需要知道要比较的字符或字符串的大小以及它为解决方案生成的位数.这根本不是处理Unicode的好方法. …