2010-09-21 40 views
29

我有一些代码,按对象属性排序表列。我想到在日文或中文(非字母语言)中,发送到排序函数的字符串将按照字母语言的方式进行比较。排序在非字母(即亚洲)语言中的含义是什么?

就拿日本姓氏列表:

寿拘 (Suzuki) 
松坂 (Matsuzaka) 
松井 (Matsui) 
山田 (Yamada) 
藤本 (Fujimoto) 

当我梳理通过Javascript上面的列表中,其结果是:

寿拘 (Suzuki) 
山田 (Yamada) 
松井 (Matsui) 
松坂 (Matsuzaka) 
藤本 (Fujimoto) 

这是从日本syllabary的顺序不同,这将安排列表发音发音(日本词典会的方式):

寿拘 (Suzuki) 
藤本 (Fujimoto) 
松井 (Matsui) 
松坂 (Matsuzaka) 
山田 (Yamada) 

我想知道的是:

  1. 难道一个双字节字符真正得到对等的排序功能相比?
  2. 这种情况究竟发生了什么?
  3. (额外信贷)这样的结果是否意味着什么?分类的概念是否真的可以在亚洲(和其他)语言中使用?如果是这样,它是什么意思,以及在为这些语言创建比较函数时应该争取什么?

附录总结解答并得出结论:

首先,感谢所有谁的讨论作出了贡献。这是非常丰富和有益的。特别喊话到bobince烈瑞安浓汤杰弗里郑,并拉里ķ,他们深入周到的分析。我授予拉里克复选标记为我指出我的问题未能预见的解决方案,但我上调了每个我认为有用的答案。

的共识似乎是:

  1. 中国和日本的字符串由Unicode码位排序,其顺序可以对可能在某些方面的理由为前提理解知识渊博的读者,但在帮助用户找到他们正在寻找的信息方面不太可能有实际价值。

  2. 要进行语义或语音排序所需的比较函数的种类太过于繁琐而不能考虑追求,特别是因为结果可能不尽人意,并且在任何情况下比较算法都会有每种语言都要更改。最好只是允许排序进行,甚至不尝试比较功能。

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

+1

+1我觉得这非常有趣 – 2010-09-21 21:01:48

回答

10

如果你想要比JS默认的字符串排序更好的东西,你可以在Javascript中实现Unicode Collation Algorithm。可能会改善一些事情。虽然正如Unicode文档所述:

排序规则不统一;它根据语言和文化不同而变化 : 德国人,法国人和瑞典人对 排序相同的字符不同。它可能 也因具体应用而不同: 即使在相同的语言, 字典可能不同于 电话簿或书籍索引。对于 非字母文字如East 亚洲表意文字,排序规则可以是 或者是注音字符或基于 的字符。

Wikipedia article指出,由于排序规则是在非字母文字如此艰难,现在是一个天的答案是,使它很容易通过输入字符来查找信息,而不是通过名单看。

我建议您与真正知识渊博的应用程序的最终用户交谈,以了解他们如何最好地表现其行为。订购中文字符的问题并不是您的应用程序所特有的。另外,如果您不想在您的系统中实现排序规则,另一个解决方案是创建一个将名称存储在MySql或其他数据库中的Ajax服务,然后使用命令语句查找数据。

+0

非常感谢您提供周到而全面的答案。请参阅我的问题附录。 – Robusto 2010-09-22 13:43:57

1

是的,字符得到比较。不过,它们通常是根据它们的Unicode代码点进行比较的,这在平假名和汉字之间有很大不同 - 使得这种排序在日文中可能无用。 (汉字借用中文,但他们用汉语出现的顺序与平假名的意思不一致)。有些归类可能会使某些字符出于比较目的而“相等”,但我不知道是否有人会认为汉字等同于构成其发音的平假名 - 特别是因为一个字符可以有许多不同的发音。

在中文或韩文或其他没有3种不同字母(其中一种非常不规则)的语言中,它可能不是一个问题。

1

这些按码值按升序排序。这对于读者来说无疑是毫无意义的。为日本人设计一个明智的排序方案并不是不可能的,但是对汉字进行排序很困难(部分原因是我们不一定知道我们是在看日文还是中文),很多程序员都在为这个解决方案而努力。

3

字符串由字符比较字符,其中code point value defines the order

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

如果您需要的不仅仅是这些,您需要使用字符串比较,以便将排序规则考虑在内。

+0

非常感谢您的深思熟虑的全面解答。请参阅我的问题附录。 – Robusto 2010-09-22 13:44:16

0

回想一下,在JavaScript中,你可以进入排序()函数中,你可以整理自己实现,以达到一种是关系到人类:

myarray.sort(function(a,b){

//return 0, 1, or -1 based on the comparison of the two strings

});

+0

谢谢,但我已经知道如何在排序函数中比较两个字符串。我试图得到的是比较应该努力比较两个双字节值以便对该语言的读者有用。 – Robusto 2010-09-21 21:00:39

23

在一个排序函数中,一个双字节字符是否真的与另一个字符进行比较?

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

像在Shift-JIS这样的编码中,术语'双字节'在Web上下文中没有意义:DOM和JavaScript字符串本地为Unicode,浏览器接收到的编码页中的原始字节早已消失。

这样的结果是否意味着什么呢?

小。 Unicode代码点并不声称提供任何特定的排序...对于一个,因为没有全球接受的排序。即使对于ASCII拉丁字符最基本的情况,语言也不一致(例如,vw是否是相同的字母,或者i的大写字母是I还是İ)。而且CJK比这更加强大。

主要的Unicode CJK统一表意文字块恰巧是按照笔画和笔画数(康熙字典顺序)排序的,这可能有点模糊。但是使用来自任何其他CJK扩展块的字符,或混合一些假名或romaji,并且它们之间没有有意义的顺序。

Unicode Consortium do attempt定义了一些通用排序规则,但它很复杂,并且通常不会在语言级别尝试。真正需要语言敏感的排序功能的系统(如操作系统,数据库)往往有自己的排序规则。

这是从五十音

是的顺序不同。一般来说,除了排序问题外,要按照音节准确处理汉字是一项非常困难的任务,因为您必须猜测发音。 JavaScript不能真实地知道“藤本”的意思是“藤本”而不是“touhon”;这种事情需要深入内置的字典和仍然不可靠的启发式...不是你想要编程语言的东西。

+0

非常感谢您提供周到全面的答案。请参阅我的问题附录。 – Robusto 2010-09-22 13:43:21

+0

另外,对于每个角色的不同读物(onyomi和kunyomi)都会使得它几乎不可能针对日语中的语音命令。我没有想到,但我应该有。 – Robusto 2010-09-22 13:49:19

3

其他人已经回答了其他问题,我会在这一个:

又该一个在创造一个 比较功能对于那些语言争取?

这样做的一种方法是,您需要创建一个可以“读取”字符的程序;也就是说,能够将汉字/汉字字符映射到他们的“声音”(拼音/平假名阅读)。在最简单的层面上,这意味着一个将汉字/汉字映射到声音的数据库。当然,这比听起来更难(双关语并非意图),因为很多角色在不同的背景下可能有不同的发音,而中国人有许多不同的方言可供考虑。

另一种方法是按笔画顺序排列。这意味着需要有一个将汉字/汉字映射到他们的笔画的数据库。另一个问题:中文和日文用不同的笔画顺序写。然而,除了日文和中文之间的差异之外,在单个文本中使用笔画排序更加一致,因为汉字/汉字字符几乎总是使用相同笔画顺序书写,而不管它们的意思或阅读方式如何。类似的想法是按部首而不是简单的笔画顺序排序。

第三种方法是按Unicode代码点进行排序。这很简单,并始终给出无可争议的一致的顺序;然而,问题在于排序顺序对于人类来说毫无意义。

最后一种方法是重新考虑对绝对排序的需求,并且只是使用一些启发式来根据用户的需求进行排序。例如,在购物车软件中,您可以根据用户的购买习惯或价格进行分类。这样可以避免这个问题,但大多数情况下它都可以工作(除非编译字典)。

正如您所看到的,前两种方法需要创建一个一对多映射的庞大数据库,但它们仍然不总是提供有用的结果。第三种方法也需要一个庞大的数据库,但许多编程语言已经将该数据库内置到该语言中。最后一种方法是启发式的,可能是最有用的,然而它们注定永远不会给出一致的排序(比前两种方法差得多)。

+0

非常感谢您提供深思熟虑的全面解答。请参阅我的问题附录。 – Robusto 2010-09-22 13:45:22

1

许多编程语言中的正常字符串比较函数旨在确保可以将字符串排序为唯一顺序,以允许二进制搜索和重复检测等算法正常工作。要以对人类读者有意义的方式对数据进行排序,必须知道数据代表什么。例如,在英文电影名单中,“El Mariachi”通常会在“E”下排序,但在西班牙电影名单中,它将排序在“M”下。应用程序需要除字符串本身之外的信息来知道如何对字符串进行排序。

1

第一季度(你能排序)和第三季度(有意义排序)的答案对中文(从大陆的角度来说)都是“是”。对于Q2(如何排序):

所有中文字符在pinyin中定义的发音都是明确的(有些是复音),而且它更常见(如在几乎所有的中文字典中)以拼音排序,其中没有歧义。然后按笔画顺序对具有相同发音的字符进行排序。

复调字符对排序构成额外的挑战,因为它们的拼音通常取决于它们所在的单词(我听说日文字符可能更毛茸茸)。例如,人物阿在阿姨(括号中的音)和阿胶中的e(1)中发音为a(1)。所以如果你需要对单词或句子进行排序,你不能简单地从每个项目看一个角色。

+0

非常感谢您提供深思熟虑的全面解答。请参阅我的问题附录。 – Robusto 2010-09-22 13:45:45

相关问题