Rob*_*sto 30 javascript arrays sorting unicode
我有一些代码按对象属性对表列进行排序.我想到,在日语或中文(非字母语言)中,发送到sort函数的字符串将按照字母语言的方式进行比较.
以日本姓氏列表为例:
?? (Suzuki)
?? (Matsuzaka)
?? (Matsui)
?? (Yamada)
?? (Fujimoto)
Run Code Online (Sandbox Code Playgroud)
当我通过Javascript对上面的列表进行排序时,结果是:
?? (Suzuki)
?? (Yamada)
?? (Matsui)
?? (Matsuzaka)
?? (Fujimoto)
Run Code Online (Sandbox Code Playgroud)
这与日语音节的排序不同,日语音节会按照发音方式排列列表(日语字典的方式):
?? (Suzuki)
?? (Fujimoto)
?? (Matsui)
?? (Matsuzaka)
?? (Yamada)
Run Code Online (Sandbox Code Playgroud)
我想知道的是:
增加答案并提出结论的附录:
首先,感谢所有为讨论作出贡献的人.这提供了非常丰富的信息和帮助.特别呼吁,他们,Lie Ryan,Gumbo,Jeffrey Zheng和Larry K,进行了深入而深思熟虑的分析.我将复选标记给Larry K,指出我的解决方案,我的问题未能预见到,但我找到了我认为有用的每个答案.
共识似乎是:
中文和日文字符串按Unicode代码点排序,它们的排序可能基于一个理论基础,可能在某种程度上可以让知识渊博的读者理解,但在帮助用户找到他们所知的信息方面不太可能具有很大的实用价值.寻求.
在语义或语音上进行排序所需的比较函数的类型是考虑追求的过于繁琐,特别是因为结果可能不太令人满意,并且在任何情况下都必须针对每个更改比较算法语言.最好只是为了在不尝试比较功能的情况下进行排序.
我可能在这里问错了问题.也就是说,我想得太多了"箱子里面"没有考虑到真正的问题不是如何使这些语言排序是有用的,但我要如何提供在列表中找到的物品的有用方式用户.西方人会不由自主地想到了这个目的的排序,我是有罪的那个.拉里ķ向我指出这表明维基百科文章的过滤功能可能是亚洲的读者更有用.这就是我打算追求的目标,因为它至少和排序一样快,客户端.我将保留列排序,因为它在西方语言中很好理解,并且因为任何语言的发言者都会发现日期和其他基于数字的数据类型的排序很有用.但我还将添加过滤机制,这对于任何语言的长列表都很有用.
bob*_*nce 23
在sort函数中是否真的可以将一个双字节字符与另一个字符进行比较?
StringJavaScript中的本机类型基于UTF-16代码单元,这就是比较的内容.对于Basic Multilingual Plane中的字符(所有这些都是),这与Unicode代码点相同.
像Shift-JIS这样的编码中的术语"双字节"在Web上下文中没有意义:DOM和JavaScript字符串本身是Unicode,浏览器接收的编码页面中的原始字节很久就消失了.
这种结果是否意味着什么呢?
小.Unicode码点不要求提供任何特定顺序......为一体,因为是没有全球公认的排序.即使对于ASCII拉丁字符最基本的情况下,语言不同(比如,是否v和w在同一封信中,还是大写的i是I或?).而且CJK比这更有趣.
主要的Unicode CJK统一表意文字块碰巧按行数和笔画数量(康熙字典顺序)排序,这可能非常有用.但是使用来自任何其他CJK扩展块的字符,或者混合使用某些假名或者romaji,并且它们之间没有任何有意义的排序.
Unicode Consortium 确实尝试定义一些通用排序规则,但它很复杂,通常不会在语言级别尝试.真正需要语言敏感排序能力的系统(例如操作系统,数据库)往往有自己的整理方案.
这与日语音节的排序不同
是.除了校对问题之外,通过音节准确处理汉字是一项非常困难的任务,因为你必须猜测发音.JavaScript无法真实地知道,'藤本',你的意思是'藤本',而不是'touhon'; 这种事情需要深入的内置词典和仍然不可靠的启发式...而不是你想要用编程语言构建的那种东西.
Lar*_*y K 10
如果你想要比字符串的默认JS排序更好的东西,你可以在Javascript中实现Unicode排序算法.可能会改善一些事情.虽然Unicode文档说明:
整理不统一; 它根据语言和文化而有所不同:德国人,法国人和瑞典人对不同的人物进行不同的排序.它也可能因具体应用而异:即使在同一种语言中,字典也可能与电话簿或书籍索引不同.对于非字母脚本,例如东亚表意文字,整理可以是语音或基于角色的外观.
在维基百科的文章指出,由于排序规则是在非字母文字如此艰难,现在是一个天,答案是使它很容易通过输入字符查找信息,而不是通过名单看.
我建议您与应用程序中真正知识渊博的最终用户交谈,看看他们最喜欢的行为方式.订购中文字符的问题并不是您的应用所特有的.
此外,如果您不想在系统中实现排序规则,则可以使用另一种解决方案来创建将名称存储在MySql或其他数据库中的Ajax服务,然后使用订单语句查找数据.