Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在非字母(即亚洲)语言中,排序意味着什么?_Javascript_Arrays_Sorting_Unicode - Fatal编程技术网

Javascript 在非字母(即亚洲)语言中,排序意味着什么?

Javascript 在非字母(即亚洲)语言中,排序意味着什么?,javascript,arrays,sorting,unicode,Javascript,Arrays,Sorting,Unicode,我有一些按对象属性对表列进行排序的代码。我突然想到,在日语或汉语(非字母语言)中,发送到排序函数的字符串将与字母语言进行比较 以日本姓氏列表为例: 寿拘 (Suzuki) 松坂 (Matsuzaka) 松井 (Matsui) 山田 (Yamada) 藤本 (Fujimoto) 当我通过Javascript对上述列表进行排序时,结果是: 寿拘 (Suzuki) 山田 (Yamada) 松井 (Matsui) 松坂 (Matsuzaka) 藤本 (Fujimoto) 这与日语的顺序不同,日语的顺

我有一些按对象属性对表列进行排序的代码。我突然想到,在日语或汉语(非字母语言)中,发送到排序函数的字符串将与字母语言进行比较

以日本姓氏列表为例:

寿拘 (Suzuki)
松坂 (Matsuzaka)
松井 (Matsui)
山田 (Yamada)
藤本 (Fujimoto)
当我通过Javascript对上述列表进行排序时,结果是:

寿拘 (Suzuki)
山田 (Yamada)
松井 (Matsui)
松坂 (Matsuzaka)
藤本 (Fujimoto)
这与日语的顺序不同,日语的顺序是按语音顺序排列列表(就像日语词典那样):

我想知道的是:

  • 在排序函数中,一个双字节字符真的可以与另一个进行比较吗
  • 这种情况到底是怎么回事
  • (额外学分)这样的结果有什么意义吗?排序的概念在亚洲(和其他)语言中真的有效吗?如果是的话,这意味着什么?在为这些语言创建比较函数时,应该努力做些什么

  • 总结答案和得出结论的附录:

    首先,感谢所有参与讨论的人。这是非常有益的信息。为博宾塞、李瑞安秋葵郑杰弗里拉里K的深入和深思熟虑的分析,向他们发出了特别的欢呼。我给Larry K打了个勾号,因为他给我指出了一个我的问题没有预见到的解决方案,但我把每一个有用的答案都打了勾

    共识似乎是:

  • 中文和日文字符串是按Unicode码点排序的,它们的排序可能基于一种原理,这种原理可能在某种程度上对知识渊博的读者来说是可以理解的,但在帮助用户找到他们正在寻找的信息方面不太可能有实际价值

  • >P>这样一种比较函数,它在语义上或语音上都是有用的,这是很难考虑的,特别是因为结果可能不尽如人意,而且在任何情况下,每个语言都需要改变比较算法。最好是在不尝试比较函数的情况下继续排序

  • 我可能问错问题了。也就是说,我“在盒子里”想得太多了,而没有考虑到真正的问题不是如何使排序在这些语言中有用,而是如何为用户提供一种在列表中查找项目的有用方法。西方人会自然而然地想到分类就是为了这个目的,我为此感到内疚。Larry K给我指了指维基百科上的一篇文章,文章认为过滤功能对亚洲读者可能更有用。这就是我计划追求的目标,因为它至少和客户端排序一样快。我将保留列排序,因为它在西方语言中很容易理解,因为任何语言的使用者都会发现日期排序和其他基于数字的数据类型很有用。但我还将添加过滤机制,这在任何语言的长列表中都很有用


  • 是的,角色之间进行比较。不过,它们通常是根据Unicode代码点进行比较的,平假名和汉字之间有很大的不同,这使得这种排序在日语中可能毫无用处。(汉字是从中文借来的,但它们在中文中出现的顺序与代表相同含义的平假名的顺序不一致)。为了比较,有一些排序可以使一些字符“相等”,但我不知道是否有一个汉字会被认为是相当于包含其发音的平假名——特别是因为字符可以有不同的发音。
    在中文、韩文或其他没有3个不同字母的语言中(其中一个字母是非常不规则的),这可能不太成问题。

    这些字母按代码点值升序排序。这对人类读者来说毫无意义。为日语设计一个合理的排序方案并非不可能,但对汉字进行排序很困难(部分原因是我们不一定知道我们是在看日语还是中文),很多程序员都支持这种解决方案。

    字符串是逐字符比较的,其中:

    字符串比较对代码点值序列使用简单的词典排序。没有人试图使用Unicode规范中定义的更复杂、面向语义的字符或字符串相等性和排序顺序定义。因此,根据Unicode标准,规范上相等的字符串可能被测试为不相等。实际上,该算法假设两个字符串都已处于标准化形式


    如果您需要的不止这些,那么您将需要使用一个可以考虑排序规则的字符串比较。

    回想一下,在JavaScript中,您可以将一个可以自己实现排序的函数传递到sort(),以便实现对人类重要的排序:

    
    排序(函数(a,b){

    //根据两个字符串的比较返回0、1或-1

    })

    在排序函数中,一个双字节字符真的可以与另一个进行比较吗

    JavaScript中的本机
    字符串
    类型基于UTF-16代码单元,这就是比较的结果。对于基本多语言平面中的字符(所有这些都是),这与Unicode代码点相同

    像Shift-JIS这样的编码中的术语“双字节”在web上下文中没有任何意义:DOM和JavaScript字符串本机是Unicode,浏览器接收到的编码页面中的原始字节早已消失

    这样的结果有什么意义吗

    很少。Unicode代码点不要求
    寿拘 (Suzuki)
    藤本 (Fujimoto)
    松井 (Matsui)
    松坂 (Matsuzaka)
    山田 (Yamada)