Unicode 文字列があり、次の要件と比較したいと考えています。
紛らわしい s [1] 文字は同じ文字と見なす必要があります。例: T (LATIN CAPITAL LETTER TU 0054) should be == 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
すべての紛らわしい文字を対応するラテン文字に置き換える一時的なものを作成すると考えています。
実際のプログラムでは、それぞれ 1 つの単語を含む 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=
お時間をいただきありがとうございます!