我将问题归结为
strcoll()函数问题,该问题与Unipre规范化无关。回顾:我的最小示例展示了
uniq依赖当前语言环境的不同行为:
$ echo -e "xc9xa2nxc9xac" > test.txt$ cat test.txtɢɬ$ LC_COLLATE=C uniq -D test.txt$ LC_COLLATE=en_US.UTF-8 uniq -D test.txtɢɬ
显然,如果语言环境是
en_US.UTF-8
uniq对待
ɢ并
ɬ作为重复项,则情况并非如此。然后,我再次使用运行相同的命令,
valgrind并使用来调查了两个调用图
kcachegrind。
$ LC_COLLATE=C valgrind --tool=callgrind uniq -D test.txt$ LC_COLLATE=en_US.UTF-8 valgrind --tool=callgrind uniq -D test.txt$ kcachegrind callgrind.out.5754 &$ kcachegrind callgrind.out.5763 &
唯一的区别是,与该版本
LC_COLLATE=en_US.UTF-8名为
strcoll()而
LC_COLLATE=C没有这样做。因此,我提出了以下最小示例
strcoll():
#include <iostream>#include <cstring>#include <clocale>int main(){ const char* s1 = "xc9xa2"; const char* s2 = "xc9xac"; std::cout << s1 << std::endl; std::cout << s2 << std::endl; std::setlocale(LC_COLLATE, "en_US.UTF-8"); std::cout << std::strcoll(s1, s2) << std::endl; std::cout << std::strcmp(s1, s2) << std::endl; std::setlocale(LC_COLLATE, "C"); std::cout << std::strcoll(s1, s2) << std::endl; std::cout << std::strcmp(s1, s2) << std::endl; std::cout << std::endl; s1 = "xa2"; s2 = "xac"; std::cout << s1 << std::endl; std::cout << s2 << std::endl; std::setlocale(LC_COLLATE, "en_US.UTF-8"); std::cout << std::strcoll(s1, s2) << std::endl; std::cout << std::strcmp(s1, s2) << std::endl; std::setlocale(LC_COLLATE, "C"); std::cout << std::strcoll(s1, s2) << std::endl; std::cout << std::strcmp(s1, s2) << std::endl;}
输出:
ɢɬ0-1-10-1��0-1-10-1
那么,这怎么了?为什么对两个不同的字符
strcoll()返回
0(等于)?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)