13

我正在努力开始使用 C++ ICU 库。我试图让最简单的例子工作,但即使这样也失败了。我只想输出一个 UTF-8 字符串,然后从那里开始。

这是我所拥有的:

#include <unicode/unistr.h>
#include <unicode/ustream.h>

#include <iostream>

int main()
{
    UnicodeString s = UNICODE_STRING_SIMPLE("привет");

    std::cout << s << std::endl;

    return 0;
}

这是输出:

$ g++ -I/sw/include -licucore -Wall -Werror -o icu_test main.cpp 
$ ./icu_test 
пÑивеÑ

我的终端和字体支持 UTF-8,我经常使用带有 UTF-8 的终端。我的源代码是 UTF-8。

我认为也许我需要以某种方式将输出流设置为 UTF-8,因为 ICU 将字符串存储为 UTF-16,但我真的不确定,我会认为 ustream.h 提供的运算符无论如何都会这样做。

任何帮助将不胜感激,谢谢。

4

3 回答 3

15

如果您将初始化程序更改为:

UnicodeString s("привет");

您使用的宏仅适用于包含“不变字符”的字符串,即只有拉丁字母、数字和一些标点符号

如前所述,输入/输出代码页很棘手。你说:

我的终端和字体支持 UTF-8,我经常使用带有 UTF-8 的终端。我的源代码是 UTF-8。

这可能是真的,但 ICU 不知道那是真的。进程代码页可能不同(例如 iso-8859-1),输出代码页可能不同(例如 shift-jis)。然后,该程序将无法运行。但是,使用 API UNICODE_STRING_SIMPLE 的不变字符仍然可以工作。

希望这可以帮助。

srl, ICU 开发

于 2010-04-29T18:34:47.833 回答
3

如果将输出写入文件会发生什么(使用终端中的管道重定向,或者通过在程序本身中打开文件流)

这将确定是否是终端未能正确处理输出。

如果在调试器中检查输出字符串会发生什么?它是否包含正确的值?找出你的字符串的 UTF-8 编码应该是什么样子,并将它与你在调试器中得到的进行比较。或者打印出每个字节的整数值,并验证它们是否正确。

使用编码时,确定问题是出在程序本身还是出在将文本输出到系统时发生的转换总是很棘手(但必不可少)。从等式中取出终端并验证您的程序是否生成正确的输出。

于 2010-04-29T18:13:03.127 回答
1

operator<<(ostream, UnicodeString)使用 ICU 的“默认转换器”在 UTF16 和字符之间进行转换。AFAIU,“默认转换器”(如果您没有明确设置它ucnv_setDefaultName())取决于平台和 ICU 的编译方式。你从中得到ucnv_getDefaultName()什么?

于 2010-04-29T18:35:35.867 回答