gpt4 book ai didi

c++ Unicode 字符串与易混淆字符的比较。例如(U 0054)应该是==(U03A4)等

转载 作者:行者123 更新时间:2023-11-30 04:24:52 24 4
gpt4 key购买 nike

我有 Unicode 字符串,我想与以下要求进行比较。

易混淆的 s [1] 个字符应该被认为是同一个字符, 示例:T(拉丁文大写字母 T U 0054)应为 == T(希腊文大写字母 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 locale 命令输出:

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=

感谢您的宝贵时间!

最佳答案

正如 user1675224 所说,您应该使用 ICU 而不是尝试推出自己的算法。

例如,使用uspoof_areConfusable :

UErrorCode status = 0;
USpoofChecker *sc = uspoof_open(&status);
int result = uspoof_areConfusable(sc, s1.data(), s1.length(), s2.data(), s2.length(), &status);
uspoof_close(sc);

如果您要相互比较大量字符串,您应该使用 uspoof_getSkeleton 将它们转换为它们的骨架,并将其放入集合或哈希集中。

关于c++ Unicode 字符串与易混淆字符的比较。例如(U 0054)应该是==(U03A4)等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12479922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com