代码之家  ›  专栏  ›  技术社区  ›  Robusto

排序在非字母(即亚洲)语言中是什么意思?

  •  29
  • Robusto  · 技术社区  · 15 年前

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

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

    当我通过Javascript对上面的列表排序时,结果是:

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

    这与日本人的命令不同 syllabary

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

    我想知道的是:

    1. 在排序函数中,一个双字节字符真的可以与另一个进行比较吗?
    2. 在这种情况下到底发生了什么?
    3. (额外学分)这样的结果有什么意义吗?排序的概念真的适用于亚洲(和其他)语言吗?如果是的话,这意味着什么?在为这些语言创建比较函数时,我们应该努力做些什么?

    首先,感谢所有参与讨论的人。这是非常有益的信息。特别喊话 博宾塞 , 莱恩 , 秋葵 , 郑杰弗里 ,和 拉里K 拉里K 我的问题没有预见到解决问题的方法,但我把每一个有用的答案都勾了起来。

    共识似乎是:

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

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

    9 回复  |  直到 10 年前
        1
  •  10
  •   Larry K    15 年前

    Unicode Collation Algorithm

    排序规则不是统一的,而是不同的 根据语言和文化: 相同的字符不同。可能吧 也因具体应用而异: 即使是同一种语言, 电话簿或图书索引。为了 非字母脚本,如East 语音或基于

    这个 Wikipedia article 指出,由于非字母脚本的排序非常困难,现在的答案是通过输入字符而不是通过查看列表来非常容易地查找信息。

    另外,如果您不想在系统中实现排序规则,另一种解决方案是创建一个Ajax服务,将名称存储在MySql或其他数据库中,然后用order语句查找数据。

        2
  •  23
  •   bobince    15 年前

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

    本地人 String

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

    这样的结果有什么意义吗?

    没有全球接受的订购。即使是最基本的ASCII拉丁字符,语言也不一致(例如 v w 是同一个字母,还是大写字母 i I İ

    主要的Unicode-CJK统一表意字符块碰巧是按字根和笔画数排序的(康熙字典顺序),这可能是含糊不清的有用。但是使用任何其他CJK扩展块中的字符,或者混合使用一些假名或罗马字符,它们之间将没有意义的排序。

    Unicode联盟 do attempt

    这与日语音节的顺序不同

    对。除了一般的排序问题外,按音节准确地处理汉字是一项非常困难的任务,因为你必须猜测发音。JavaScript实际上并不知道您所说的Fujimoto而不是touhon;这类东西需要深入的内置字典和仍然不可靠的启发式方法。。。不是那种你想在编程语言中构建的东西。

        3
  •  3
  •   Gumbo    15 年前

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

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

        4
  •  3
  •   Lie Ryan Bryan    15 年前

    其他人已经回答了其他问题,我将回答这个问题:

    一个人应该为创造一个 比较这些语言的函数?

    一种方法是,您需要创建一个可以“读取”字符的程序;也就是说,能够将汉字/汉字字符映射到它们的“声音”(拼音/平假名读取)。在最简单的层次上,这意味着一个将汉字/汉字映射到声音的数据库。当然,这比听起来更困难(双关语不是故意的),因为很多字符在不同的上下文中可以有不同的发音,而汉语有很多不同的方言要考虑。

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

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

    最后一种方法是重新考虑绝对排序的必要性,只需使用一些启发式方法,根据与用户需求的相关性进行排序。例如,在购物车软件中,您可以根据用户的购买习惯或价格进行排序。这种方法可以避免这个问题,但大多数情况下都是有效的(除非你在编字典)。

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

        5
  •  1
  •   cHao    15 年前

    是的,人物会被比较。不过,它们通常是根据Unicode代码点进行比较的,而平假名和汉字的代码点有很大的不同,这使得这种类型在日语中可能毫无用处。(汉字是从中国借来的,但它们在汉语中出现的顺序与平假名的顺序并不一致,平假名代表了相同的意思)。为了便于比较,有一些排序规则可以使某些字符“相等”,但我不知道是否有一种排序规则会认为汉字等同于构成其发音的平假名——特别是因为一个字符可以有许多不同的发音。

    在汉语、韩语或其他没有3个不同字母的语言中(其中一个字母是非常不规则的),这可能不是什么问题。

        6
  •  1
  •   Chuck    15 年前

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

        7
  •  1
  •   supercat    15 年前

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

        8
  •  1
  •   Geoffrey Zheng    15 年前

    对于中国人来说,Q1(你会排序)和Q3(排序有意义)的答案都是“是”(从大陆的角度来看)。对于Q2(如何排序):

    pinyin ,而且更常见的是(在几乎所有的中文字典中)按拼音排序,没有歧义。发音相同的字符按笔划顺序排序。

    复调字符给分类带来了额外的挑战,因为它们的拼音通常取决于它们所在的单词(我听说日语字符可能更多毛)。例如,字符¨在§¨(括号中的音调)中发音为a(1),在¨中发音为e(1)。因此,如果你需要对单词或句子进行排序,你不能一次只看每个项目中的一个字符。

        9
  •  0
  •   automagic    15 年前

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

    myarray.sort(function(a,b){

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

    });