我想比较波斯语中的字符串(utf8)。我知道我必须使用像L“گل”这样的东西,它必须保存在wchar_t *或wstring中。问题是,当我通过函数比较compare()字符串时,我得不到正确的结果。
答案 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进行规范化,然后才能进行实际比较:
答案 2 :(得分:2)
如果您要比较的字符串已经是特定的,明确的编码,那么请不要使用wchar_t
并且不要使用L""
文字 - 那些不是用于Unicode,而是用于实现定义的不透明编码only。
如果您的字符串是UTF-8,请使用char
的字符串。如果要将它们转换为原始Unicode代码点(UCS-4 / UTF-32),或者如果您已将它们转换为该格式,请将它们存储在uint32_t
或char32_t
s的字符串中如果你有一个现代的编译器。
如果你有C ++ 11,你的文字可以是char str8[] = u8"گل";
或char32_t str32[] = U"گل";
。 See this topic了解更多内容。
如果要与命令行参数或环境进行交互,请使用iconv()
将WCHAR转换为UTF-32或UTF-8。