我的语言环境的字母顺序

时间:2015-05-23 21:24:10

标签: c string

我想知道是否有一个函数按字母顺序比较wchar_t类型的两个变量(在设置我的语言环境后 - 在我的情况下代码是

    setlocale(LC_ALL, "pl_PL.UTF-8");

有人建议wcscoll不会给我太多,因为它会比较字符串(即wchar_t *)。如果我有两个a,b类型wchar_t的变量,则调用wcscoll(&a, &b)无法正常工作

我很感激一些帮助

3 个答案:

答案 0 :(得分:3)

简短的回答是"否"。依赖于区域设置的排序规则是两个字符串上的函数,而不是两个字符。你可以整理两个一个字符长的字符串,但这与两个单独的字符不完全相同。

如建议的那样,您使用wcscoll来比较两个wstrings。为了将wchars转换为wstrings,您需要创建以null结尾的wchar_t数组。所以你可以使用这样的函数:

int wc_collate(wchar_t a, wchar_t b) {
  return wcscoll((wchar_t[2]){a, 0}, (wchar_t[2]){b, 0});
}

我无法在C标准中找到任何证据来证明我在第一段中的主张是合理的,但Posix rationale更为明确:

  

管理整理的规则在某种程度上取决于使用。至少可以区分五种不同级别的日益复杂的整理规则:

     
      
  1. 字节/机器代码顺序:这是UNIX系统和许多专有操作系统中的历史归类顺序。这里逐个字符地执行校对,而不考虑上下文。主要的优点是它通常很快并且也是完全确定的;当本机机器归类序列符合用户期望时,它可以很好地工作。

  2.   
  3. 字符顺序:在此级别上,逐个字符地执行整理,而不考虑上下文。然而,字符之间的顺序不是由代码值决定的,而是由用户对"正确"的预期决定的。字符之间的顺序。此外,这样的(简单)整理顺序可以指定某些字符相等地进行整理(例如,大写和小写字母)。

  4.   
  5. 字符串排序:在此级别上,根据相对简单的规则比较整个字符串。几个"通过''可能需要确定两个字符串之间的顺序。在某些通道中可能会忽略字符,但在其他通道中则不会;弦可以在不同方向上进行比较;并且可以在比较字符串之前执行简单的字符串替换。这个级别最好描述为"字典"排序;它基于拼写,而不是单词的发音或含义。

  6.   
  7. 文字搜索排序:这是对上一级别的进一步细化,最好描述为"电话簿订购''一些常见的同音异义词(单词拼写不同但发音相同)被整理在一起;数字被整理好像它们被拼写出来一样,等等。

  8.   
  9. 语义级排序:根据词的含义整理单词和字符串;整个单词(例如"")被删除;排序不是确定性的。这通常需要特殊软件,并且高度依赖于预期用途。

  10.         

    虽然历史校对顺序正式位于1级,但对于英语,它大致对应于2级的元素。用户希望看到ls实用程序的输出与字典中的输出非常相似。虽然电话簿订购将是标准整理的最佳目标,但由于订单依赖于语言,因此排除了这一点。此外,要求是订单必须仅由文本字符串和整理规则确定;没有外部信息(例如,"发音词典")可能是必需的。

         

    因此,整理支持的目标是第3级。

答案 1 :(得分:0)

您正在将指针传递给单个宽字符。 wcscoll期望字符串以空宽字符结束。

答案 2 :(得分:0)

wcscoll()期望以空值终止的字符串作为参数,其中wcscoll(&a, &b)变量为ab wchar_t类型wchar_t A[2]; wchar_t B[2]; A[1]='\0'; B[1]='\0'; A[0] = a; B[0] = b; 未按预期工作。< / p>

作为快速而肮脏的解决方法,您可能需要尝试以下方法:

wcscoll(A, B)

并改为呼叫<root> <loot> <tally>value1</tally> <tally>value2</tally> </loot> <loot> <tally>value3</tally> <tally>value4</tally> </loot> </root>

不是100%肯定它,我强烈怀疑,你正在寻找什么存在并且是可能的,因为似乎有写作系统需要多个字符来确定整理顺序。

Unicode技术标准#10 Unicode归类算法(参见:http://unicode.org/reports/tr10/)提到以下示例

  

在斯洛伐克语中,有向图的分类就像h之后的单独字母一样。