我有一些代码可以按对象属性对表列进行排序。我想到,在日语或中文(非字母语言)中,发送到排序函数的字符串将以字母语言的方式进行比较。
以日本姓氏列表为例:
寿拘 (Suzuki)
松坂 (Matsuzaka)
松井 (Matsui)
山田 (Yamada)
藤本 (Fujimoto)
当我通过 Javascript 对上面的列表进行排序时,结果是:
寿拘 (Suzuki)
山田 (Yamada)
松井 (Matsui)
松坂 (Matsuzaka)
藤本 (Fujimoto)
这和日本人的排序不一样音节表 http://en.wikipedia.org/wiki/Hiragana,这会按语音排列列表(就像日语词典的方式):
寿拘 (Suzuki)
藤本 (Fujimoto)
松井 (Matsui)
松坂 (Matsuzaka)
山田 (Yamada)
我想知道的是:
- 在排序函数中,一个双字节字符真的会与另一个双字节字符进行比较吗?
- 究竟发生了什么?
- (额外加分)这样的排序结果有什么意义吗?排序的概念在亚洲(和其他)语言中真的有效吗?如果是这样,这意味着什么?在为这些语言创建比较函数时应该努力做什么?
总结答案并得出结论的附录:
首先,感谢所有参与讨论的人。这是非常有用的信息。特别鸣谢bobince, Lie Ryan, Gumbo, 郑杰弗里, and Larry K,感谢他们深入而深思熟虑的分析。我将复选标记授予Larry K为我指明了我的问题未能预见的解决方案,但我勾选了我认为有用的每个答案。
共识似乎是:
中文和日文字符串按 Unicode 代码点排序,它们的排序可能基于某种基本原理,这种基本原理可能在某种程度上对知识渊博的读者来说是可以理解的,但在帮助用户查找他们想要的信息方面不太可能有太大的实用价值。重新寻求。
在语义或语音上进行排序所需的那种比较函数太麻烦而无法考虑追求,特别是因为结果可能不太令人满意,并且在任何情况下都必须更改每个比较算法语言。最好只是允许排序继续进行,甚至不尝试比较函数。
我可能在这里问了错误的问题。也就是说,我在“框内”思考了太多,而没有考虑到真正的问题不是如何使排序在这些语言中有用,而是如何为用户提供一种在列表中查找项目的有用方法。西方人自然而然地会想到排序来达到这个目的,我对此感到内疚。拉里·K(Larry K)向我指出了一篇维基百科文章,其中建议过滤功能可能对亚洲读者更有用。这就是我计划追求的目标,因为它至少与客户端排序一样快。我将保留列排序,因为它在西方语言中很容易理解,并且因为任何语言的使用者都会发现日期和其他基于数字的数据类型的排序很有用。但我还将添加过滤机制,这对于任何语言的长列表都很有用。
在排序函数中,一个双字节字符真的会与另一个双字节字符进行比较吗?
当地人String
JavaScript 中的 type 基于 UTF-16 代码单元,这就是进行比较的内容。对于基本多语言平面(所有这些都是)中的字符,这与 Unicode 代码点相同。
Shift-JIS 等编码中的术语“双字节”在 Web 上下文中没有任何意义:DOM 和 JavaScript 字符串本身就是 Unicode,浏览器接收到的编码页面中的原始字节早已不复存在。
这样的结果有什么意义吗?
小的。 Unicode 代码点并不声称提供任何特定的排序……其中之一是,因为is没有全球公认的订购方式。即使对于 ASCII 拉丁字符的最基本情况,语言也存在分歧(例如,关于是否v
and w
是同一个字母,还是大写i
is I
or İ
)。而 CJK 则变得更加粗糙。
主要的 Unicode CJK 统一表意文字块恰好是按部首和笔画数排序的(康熙字典顺序),这可能有点用处。但是使用任何其他 CJK 扩展块中的字符,或者混合一些假名或罗马字,它们之间将没有有意义的顺序。
统一码联盟尝试 http://unicode.org/reports/tr10/定义一些通用的排序规则,但它很复杂并且通常不会在语言级别上尝试。真正需要语言敏感排序能力的系统(例如操作系统、数据库)往往有自己的排序规则。
这与五十音表的顺序不同
是的。除了一般的校对问题之外,通过音节准确地处理汉字是一项非常困难的任务,因为你必须猜测发音。 JavaScript 无法真正知道“藤本”指的是“Fujimoto”而不是“touhon”;这类事情需要深入的内置字典和仍然不可靠的启发式方法......而不是您想要构建到编程语言中的那种东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)