我试图理解它们两个,但我没有发现任何差异,除了strcoll()
,这个参考说:
根据LC_COLLATE类别定义的当前语言环境比较两个空终止字符串。
经过再次思考,我知道我正在提出另一个需要详细回答的问题,那么在C和C++中,这个locale到底是什么?
strcmp()
函数逐个比较字符串的字节,不管这些字节是什么。
strcoll()
函数将字节按照所使用的语言环境进行转换,然后再进行比较。转换根据所使用的语言而不同。在法语中,带有重音符号的字母排在没有重音符号的字母之后。因此,é 在 e 之后。但是,é 却在f之前。strcoll()
函数可以正确地排序,而 strcmp()
函数则不能。
然而,在许多情况下,strcmp()
函数已经足够了,因为您不需要按照使用的语言环境对结果进行排序。例如,如果您只需要快速访问由字符串索引的大量数据,则会使用以该字符串索引的映射。对于这些数据进行排序通常是完全无用的,因为相对于 strcoll()
函数来说,strcmp()
函数通常更快。
有关字符的详细信息,您可能还想查看 Unicode网站。
关于语言环境,它就是指语言。默认情况下,它设置为“C”(或多或少没有语言环境)。选择位置后,语言环境会相应地设置。您也可以设置 LC_LOCALE 环境变量。实际上有许多这样的变量。但通常使用预定义函数自动考虑这些变量并为您执行正确的操作(例如格式化日期/时间、格式化数字/度量、计算大写/小写等)。
strcmp()
进行内部排序管理与显示的注释也同样出色。有些答案简洁明了,却能表达深刻的意义,我希望我能给它们点赞多次。这就是其中之一。 - WhozCraigint safe_strcoll(const char *a, const char *b)
{
int ret = strcoll(a, b);
if (ret != 0) return ret;
return strcmp(a, b);
}
echo
应用了环境变量的更改。你也应该将语言更改应用到sort
和uniq
中;最简单的方法就是使用export LANG
。 (export LANG=ja_JP.UTF-8; echo -e -n 'い\nろ\nは\nに\nほ\nへ\nと\n' | sort | uniq)
可以完美地运行。 - qsantos