我有一些代码,可以按对象属性对表格列进行排序。我意识到,在日语或中文(非字母语言)中,传递给排序函数的字符串会像字母语言一样进行比较。
以日本姓氏列表为例:
寿拘 (Suzuki)
松坂 (Matsuzaka)
松井 (Matsui)
山田 (Yamada)
藤本 (Fujimoto)
当我通过Javascript对上述列表进行排序时,结果如下:
寿拘 (Suzuki)
山田 (Yamada)
松井 (Matsui)
松坂 (Matsuzaka)
藤本 (Fujimoto)
这与日语音节表的排序不同,后者会按照语音顺序排列列表(就像日语词典一样):
寿拘 (Suzuki)
藤本 (Fujimoto)
松井 (Matsui)
松坂 (Matsuzaka)
山田 (Yamada)
我想知道的是:
- 在排序函数中,一个双字节字符是否真的与另一个字符进行比较?
- 这样的排序到底发生了什么?
- (额外加分)这样的排序结果是否有意义?在亚洲(和其他)语言中,排序的概念是否真的有效?如果是,那么这意味着什么,如何创建适用于这些语言的比较函数?
补充总结答案并得出结论:
首先,感谢所有参与讨论的人。这非常有益和有帮助。特别向bobince、Lie Ryan、Gumbo、Jeffrey Zheng 和 Larry K 表示感谢,因为他们进行了深入而周到的分析。我授予检查标记给Larry K,因为他指引我找到了一个解决方案,而我之前没有考虑到它,但我对每个有用的答案都点了赞。
共识似乎是:
中文和日文字符串按照Unicode编码点进行排序,其排序可能基于某种理由,对有知识的读者来说可能是可以理解的,但不太可能在帮助用户查找所需信息方面具有实际价值。
要使排序在语义或音系上有用,需要的比较函数过于繁琐,不值得考虑,特别是结果可能不尽如人意,而且比较算法必须针对每种语言进行更改。最好允许排序继续进行,甚至不尝试比较函数。
我在这里可能问错了问题。也就是说,我想得太局限,没有考虑到真正的问题不是如何使这些语言中的排序有用,而是如何为用户提供一个有用的方法来查找列表中的项目。西方人自动想到排序用于此目的,我也有这个问题。Larry K指向我一篇维基百科文章,建议过滤函数对亚洲读者可能更有用。这是我打算追求的,因为它至少与排序同样快速,客户端处理。我将保留列排序,因为它在西方语言中得到了很好的理解,并且任何语言的使用者都会发现日期和其他基于数字的数据类型的排序很有用。但我还将添加过滤机制,它对于任何语言的长列表都很有用。