Glib::ustring与日文字字符

4

Glib::ustring被认为在处理UTF8时表现良好,但在处理日语字符串时我遇到了问题。

如果你使用==运算符或compare方法对比这两个字符串“わたし”和“ワタシ”,它会告诉你这两个字符串相等。

我不明白为什么。Glib::ustring是如何工作的?

唯一能让这种比较得出false的方法是比较长度不同的字符串。例如,“海外わたわ”和“海外わた”。

非常奇怪...


Kensou没有提到他正在比较的两个字符串是表达相同发音的不同方式,即平假名和片假名。片假名用于外来词或“借用”词,而平假名用于语法、本土日语单词的发音指南等方面。在他得到错误结果的情况下,他正在比较不同的字符串(例如,“Hell”与“Hello”)。 - Armentage
这似乎是一个奇怪的“特性”,因为它意味着一个包含混合片假名和平假名字符串的数组将没有可预测的排序,而重复项将根据数组的初始状态顺序随机排序。 - Armentage
2个回答

1
#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
わたし
ワタシ

这听起来很奇怪。


请参阅http://www.gnu.org/s/libc/manual/html_node/Standard-Locales.html,其中指出标准语言环境为“C”,而“”则映射到您的系统语言环境。我敢打赌现在的情况是,“”映射到Unicode。更多信息请参见http://unicode.org/faq/collation.html。 - Armentage

1

Glib::ustring::compare 在内部使用 g_utf8_collate(),该函数根据当前语言环境的规则比较字符串。你的语言环境设置为日语以外的其他语言了吗?


你说的也许没错,但只要我使用的是UTF-8语言环境(无论是日语还是意大利语),我就应该能够处理UTF-8字符。 - baol
词法比较是不同的。它很可能被优化,以便在拉丁字母语言环境中,非拉丁字符都按相同顺序排序,因此比较结果相同。这似乎有点奇怪,但如果您想绕过它,请获取 c_str 并使用 strcmp() 进行比较。 - ptomato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接