Glib::ustring被认为在处理UTF8时表现良好,但在处理日语字符串时我遇到了问题。
如果你使用==运算符或compare方法对比这两个字符串“わたし”和“ワタシ”,它会告诉你这两个字符串相等。
我不明白为什么。Glib::ustring是如何工作的?
唯一能让这种比较得出false的方法是比较长度不同的字符串。例如,“海外わたわ”和“海外わた”。
非常奇怪...
Glib::ustring被认为在处理UTF8时表现良好,但在处理日语字符串时我遇到了问题。
如果你使用==运算符或compare方法对比这两个字符串“わたし”和“ワタシ”,它会告诉你这两个字符串相等。
我不明白为什么。Glib::ustring是如何工作的?
唯一能让这种比较得出false的方法是比较长度不同的字符串。例如,“海外わたわ”和“海外わた”。
非常奇怪...
#include <iostream>
#include <glibmm/ustring.h>
int main() {
Glib::ustring s1 = "わたし";
Glib::ustring s2 = "ワタシ";
std::cerr << (s1 == s2) << std::endl;
return 0;
}
输出:0
编辑:但我深入挖掘了一下:
#include <iostream>
#include <glibmm.h>
int main() {
Glib::ustring s1 = "わたし";
Glib::ustring s2 = "ワタシ";
std::cout << (s1 == s1) << std::endl;
std::cout << (s1 == s2) << std::endl;
std::locale::global(std::locale(""));
std::cout << (s1 == s1) << std::endl;
std::cout << (s1 == s2) << std::endl;
std::cout << s1 << std::endl;
std::cout << s2 << std::endl;
return 0;
}
输出:
1
0
1
1
わたし
ワタシ
这听起来很奇怪。
Glib::ustring::compare
在内部使用 g_utf8_collate()
,该函数根据当前语言环境的规则比较字符串。你的语言环境设置为日语以外的其他语言了吗?
c_str
并使用 strcmp()
进行比较。 - ptomato