如何在c ++中比较utf8字符串如波斯语?

时间:2011-08-21 21:55:02

标签: c++ string encoding

我想比较波斯语中的字符串(utf8)。我知道我必须使用像L“گل”这样的东西,它必须保存在wchar_t *或wstring中。问题是,当我通过函数比较compare()字符串时,我得不到正确的结果。

3 个答案:

答案 0 :(得分:3)

wchar_t不适用于UTF-8,但(取决于平台)通常为UTF-16或UCS-32。如果您想使用UTF-8,请使用普通旧char *string及其比较函数以获得相等性。如果你想要人性化的排序,它会更加复杂(无论你使用哪种编码)。

答案 1 :(得分:3)

非常难以比较Unicode。

请注意,除了字节相等之外,任何Unicode编码(包括UTF-8,16或32)都不能按字节进行比较。显示可能相同,但使用的字节(例如R-> L标记,代理对,显示修饰符以及非英语语言中使用的类似字符,如波斯语)将不会。

通常,如果文本的含义具有任何重要性,则需要对Unicode进行规范化,然后才能进行实际比较:

http://userguide.icu-project.org/transforms/normalization

答案 2 :(得分:2)

如果您要比较的字符串已经是特定的,明确的编码,那么请不要使用wchar_t并且不要使用L""文字 - 那些不是用于Unicode,而是用于实现定义的不透明编码only

如果您的字符串是UTF-8,请使用char的字符串。如果要将它们转换为原始Unicode代码点(UCS-4 / UTF-32),或者如果您已将它们转换为该格式,请将它们存储在uint32_tchar32_t s的字符串中如果你有一个现代的编译器。

如果你有C ++ 11,你的文字可以是char str8[] = u8"گل";char32_t str32[] = U"گل";See this topic了解更多内容。

如果要与命令行参数或环境进行交互,请使用iconv()将WCHAR转换为UTF-32或UTF-8。