strcmp函数会按照码点顺序比较UTF-8字符串吗?

11
在C程序中,我想按Unicode代码点顺序对有效的UTF-8编码字符串列表进行排序。没有根据地域的排序。
因此,我需要一个比较函数。编写这样的函数很容易,只需迭代Unicode字符即可。(我恰好使用GLib,所以我会用g_utf8_next_char迭代并比较g_utf8_next_char的返回值。)
但是,出于好奇、可能的简单性和效率,我想知道:一个简单的逐字节strcmp(或g_strcmp)是否真的能完成同样的工作?我认为应该可以,因为UTF-8首先编码最高位字节,并且需要在N+1个字节中编码的代码点将具有比需要在N个字节中编码的代码点更大的初始字节。
但也许我漏掉了什么?提前感谢您。
1个回答

12

是的,UTF-8保留了码点顺序,因此你可以直接使用strcmp。这是UTF-8的(众多)美妙之一。

需要注意的是,在Unicode中,“码点”是UTF-32值,有些人在谈论按“码点”顺序排序Unicode字符串时,实际上错误地使用“码点”一词来表示“UTF-16码元”。如果你想要顺序与UTF-16码元排序匹配,需要进行更多的工作。


非常感谢!我正要跟进我的用例,说明为什么我认为警告并不适用,然后发现这个信息就在标准中: “词典比较将字符串按字母顺序从最小到最大排序,基于UCS代码点值进行比较,相当于基于UTF-8的词典排序。” :-) - skagedal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接