我想知道是否有一个函数按字母顺序比较wchar_t
类型的两个变量(在设置我的语言环境后 - 在我的情况下代码是
setlocale(LC_ALL, "pl_PL.UTF-8");
有人建议wcscoll
不会给我太多,因为它会比较字符串(即wchar_t *
)。如果我有两个a,b
类型wchar_t
的变量,则调用wcscoll(&a, &b)
无法正常工作
我很感激一些帮助
答案 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更为明确:
管理整理的规则在某种程度上取决于使用。至少可以区分五种不同级别的日益复杂的整理规则:
字节/机器代码顺序:这是UNIX系统和许多专有操作系统中的历史归类顺序。这里逐个字符地执行校对,而不考虑上下文。主要的优点是它通常很快并且也是完全确定的;当本机机器归类序列符合用户期望时,它可以很好地工作。
字符顺序:在此级别上,逐个字符地执行整理,而不考虑上下文。然而,字符之间的顺序不是由代码值决定的,而是由用户对"正确"的预期决定的。字符之间的顺序。此外,这样的(简单)整理顺序可以指定某些字符相等地进行整理(例如,大写和小写字母)。
字符串排序:在此级别上,根据相对简单的规则比较整个字符串。几个"通过''可能需要确定两个字符串之间的顺序。在某些通道中可能会忽略字符,但在其他通道中则不会;弦可以在不同方向上进行比较;并且可以在比较字符串之前执行简单的字符串替换。这个级别最好描述为"字典"排序;它基于拼写,而不是单词的发音或含义。
文字搜索排序:这是对上一级别的进一步细化,最好描述为"电话簿订购''一些常见的同音异义词(单词拼写不同但发音相同)被整理在一起;数字被整理好像它们被拼写出来一样,等等。
- 醇>
语义级排序:根据词的含义整理单词和字符串;整个单词(例如"")被删除;排序不是确定性的。这通常需要特殊软件,并且高度依赖于预期用途。
虽然历史校对顺序正式位于1级,但对于英语,它大致对应于2级的元素。用户希望看到ls实用程序的输出与字典中的输出非常相似。虽然电话簿订购将是标准整理的最佳目标,但由于订单依赖于语言,因此排除了这一点。此外,要求是订单必须仅由文本字符串和整理规则确定;没有外部信息(例如,"发音词典")可能是必需的。
因此,整理支持的目标是第3级。
答案 1 :(得分:0)
您正在将指针传递给单个宽字符。 wcscoll期望字符串以空宽字符结束。
答案 2 :(得分:0)
wcscoll()
期望以空值终止的字符串作为参数,其中wcscoll(&a, &b)
变量为a
,b
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之后的单独字母一样。