是什么的strcmp(),并与strcoll()有什么区别?(What is the differe

2019-07-17 16:40发布

我试着理解他们两个,但我没有找到除任何差异strcoll() 这个参考说它

根据如由LC_COLLATE类别定义当前区域比较两个空终止字符串。

关于第二个想法,我知道我问了详细的回答另一个问题,究竟是这个语言环境,C和C ++?

Answer 1:

strcmp()一个取一个字符串的字节并且是无论字节是对它们进行比较。

strcoll()需要的字节数,使用语言环境转换它们,然后将结果进行比较。 改造再根据订单上的语言。 在法语中,强调字母来非突出的人后。 所以EE后。 然而,éf之前。 strcoll()得到它的权利。 strcmp()没有这么好。

然而,在许多情况下strcmp()就足够了,因为你并不需要显示在使用的语言(区域)排序结果。 例如,如果你只需要快速访问大量由你使用的地图由字符串索引的字符串索引的数据。 这可能是完全无用的使用来整理strcoll()一般是非常慢(相比于strcmp()至少)。

有关字符的详细信息,你可能还需要检查出的Unicode网站。

至于语言环境,它的语言。 缺省情况下它设置为“C”(更多或更少的,没有环境)。 一旦你选择一个位置,区域设置相应的设置。 您还可以设置LC_LOCALE环境变量。 实际上有许多这样的变量。 但一般而言,您使用预定义功能,可以自动把这些变量的帐户,并为你做正确的事情。 (即格式的日期/时间,格式号/措施,计算/小写等)



Answer 2:

出于某种原因,在我测试,在几个不同版本的glibc的所有Unicode语言环境,与strcoll()返回对于任何两个平假名为零。 这打破了排序 ,uniq的 ,并且以某种方式字符串命令交互的一切。

$回声-e -n '有\ n过滤\ n为\ n和\ n到\ n浩\ n为\ n' |排序| uniq的

这简直是​​坏无法修复。 来自世界不同地方的人可能有不同的想法是否“い”应该之前或之后被置于“ろ”,但没有人会理智的认为它们是相同的。

不,你的区域设置了日本一个并不重要:

$ LC_ALL = ja_JP.utf8 LANG = ja_JP.utf8 LC_COLLATE = ja_JP.utf8回声-e -n '有\ n过滤\ n为\和\ n到\ n浩\ n转换为\ N N' |排序| uniq的

有一些官方的邮件列表讨论,但猜测,它是在2002年,它被永远定格,因为人们不关心: https://www.mail-archive.com/linux-utf8@nl.linux.org /msg02658.html

该错误发生在我们身上的某一天,最后我们唯一的出路是设置整理区域设置为“C”,靠UTF-8编码的良好特性。 这是一个可怕的经历,因为人们实在不应该在“C”语言环境中处理所有的日数据时的工作。

因此,对于你的理智的缘故,不要直接与strcoll使用。 一个更安全的变体可能是:

int safe_strcoll(const char *a, const char *b)
{
  int ret = strcoll(a, b);
  if (ret != 0) return ret;
  return strcmp(a, b);
}

以防万一与strcoll()决定去你的...



文章来源: What is the difference between strcmp() and strcoll()?