我有 Unicode 字符串,我想与以下要求进行比较。
易混淆的 s [1] 字符应视为相同字符,例如:T (LATIN CAPITAL LETTER TU 0054) 应为 == T (GREEK CAPITAL LETTER TAU U03A4) 等
(* [1] 示例 http://unicode.org/cldr/utility/confusables.jsp?a=TESTt&r=None *)
http://www.unicode.org/Public/security/revision-03/confusablesSummary.txt
我将使用上面的文件来编写代码,但如果已经有任何免费库,我更愿意使用它。
我在想代码会创建一个临时ustring
的,其中每个易混淆的字符都将被相应的拉丁字符替换。
在实际程序中,我将测试 10x5000x10000 个字符串,每个字符串包含一个单词。
测试程序:
std::locale::global(std::locale(""));
std::cout.imbue(std::locale());
Glib::ustring s1,s2;
s1="TEST";
s2="TΕST";
s1.normalize(Glib::NORMALIZE_NFKD );
s2.normalize(Glib::NORMALIZE_NFKD );
std::cout<<"1->true, 0->false (s1==s2) => "<<(s1==s2)<<"\n";
测试程序输出:
1->true, 0->false (s1==s2) => 0
Ubuntu语言环境命令输出:
Ubuntu 12.04 64 bit>$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
感谢您的时间!