【发布时间】:2012-08-19 05:07:45
【问题描述】:
我正在尝试编写一个支持 Unicode 的跨平台应用程序。我正在使用库 UTF8-C++ (http://utfcpp.sourceforge.net/),但在遍历字符串时遇到问题:
string s1 = "Добрый день";
utf8::iterator<string::iterator> iter(s1.begin(), s1.begin(), s1.end());
for(int i = 0; i < utf8::distance(s1.begin(), s1.end()); i++, ++iter)
{
cout << (*iter);
}
上述代码在重定向到 UTF-8 格式的文本文件时,会产生以下输出:
6 3 6 3 6 3 6 3 6 3 6 3 3 2 6 3 6 3 6 3 6 3
如何让s1 的内容正确出现在文件中?
【问题讨论】:
-
输出中的空格从何而来?你的源文件是什么编码的?您使用的是哪个版本的库?
-
你真的不想在内部使用 UTF-8。这是一种出色的存储和传输格式,但在代码中使用它确实很痛苦。将其转换为 UTF-32 (Unix) 或 UTF-16 (relay UCS-2) (Win) 并使用固定大小质量。
-
@LokiAstari 和所有其他评论者 - 请阅读:utf8everywhere.org。是的,您确实想在内存中使用 utf8,并且终生忘记任何编码转换......
-
根据我的经验,多个代码单元是否也构成一个代码点通常是无关紧要的。要么我可以在代码单元方面工作(当规范化不是问题时;复制、连接、简单搜索等)或者我需要知道多个代码点必须被视为一个实体(而不仅仅是为了显示; 用于光标移动、正则表达式、拆分等)。固定宽度编码没有任何价值。 Unicode 字符基本上是可变长度的。
-
“固定宽度格式确实是进行字符串操作时的唯一方法” - 并非如此。请参阅 utf8everywhere 的常见问题解答 18。你会看到固定宽度其实没那么好,可变宽度也不错。
标签: c++ string unicode utf-8 iterator