草庐IT

javascript - 在 Javascript 中基于语言环境的排序,以预定义的方式对重音字母和其他变体进行排序

coder 2024-05-08 原文

在芬兰语中,我们将 W 排在 V 之后(与英语一样),但是因为 W 不是芬兰语的母语字母,所以它被认为是V 的变体,它被排序为等于 V,但在两个词之间唯一的区别是 VW,则V-版本先排序。一个例子阐明了正确的顺序:

Vatanen, Watanen, Virtanen

在芬兰语中,VW 整理为AÁÁ 的排序方式与 A 类似,但在唯一不同的情况下,未重音的排在第一位。同样的规则适用于所有其他重音字母,但 ÅÄÖ 在 Z 之后单独整理。

问题:以预定义方式对变体进行排序的最佳算法是什么?(例如。[Watanen, Vatanen, Virtanen][Vatanen, Watanen, Virtanen] )?

补充:这个问题与扩展有关,以涵盖在 http://cldr.unicode.org/index/cldr-spec/collation-guidelines 中定义的其他变体。 ,因为该技术很可能是相同的,并且这个问题的答案有利于尽可能广泛的受众,并且可以使排序算法与 Unicode CLDR 中定义的排序规则兼容。 Unicode CLDR 定义了三个级别的字母差异:初级(基本字母)、二级(重音字母)和三级(字符大小写)。

我想到了某种数组准备,比如在数字排序中,我们可以用零填充所有数字,使它们可以与字符串进行比较。一个示例:数组 [file1000.jpg, file3.jpg, file22.jpg] 可以准备通过用零填充来使其与字符串具有可比性: [文件 1000.jpg、文件 0003.jpg、文件 0022.jpg]。由于数组的准备,我们可以使用原生 Array.sort() 非常快速地对其进行排序。

目标语言是Javascript,不支持基于排序规则的排序,所以自定义排序功能必须自己制作。该算法是首选,但如果您也有代码,则值得 +1。

最佳答案

自从您最初提出这个问题以来,JavaScript 终于获​​得了一些体面的语言环境支持,包括整理。

阅读新的 EcmaScript 6 / Harmony功能 Intl并且,具体来说,Intl.Collator .

文档实际上并没有明确说明芬兰语支持现代排序顺序和传统排序顺序,但我已经尝试过了,它们是支持的。

要获得传统订单的整理器,您需要传递一个“花哨的”语言代码字符串:fi-u-co-trad。对于“改革后”的排序顺序,有 fi-u-co-reformed。这分解为:

  • fi - 芬兰语的 ISO 639 语言代码。
  • u - 启用 Unicode 功能/选项。 (没有很好的记录)
  • co - 排序规则选项。
  • trad - 传统排序顺序。我阅读了有关西类牙语的此选项,并且仅通过测试发现它也适用于芬兰语。 (没有很好的记录)
  • 改革 - 改革排序顺序。似乎是“传统”的反义词。如果您既不指定 trad 也不指定 reformed,您将得到 default,在某些浏览器上可能是 trad对其他人进行改革

代码:

var surnames = ['Watanen', 'Vatanen', 'Virtanen'];

var traColl = new Intl.Collator('fi-u-co-trad');
var refColl = new Intl.Collator('fi-u-co-reformed');
var defColl = new Intl.Collator('fi');

console.log('traditional:', traColl.resolved.requestedLocale + ' -> ' + traColl.resolved.collation, surnames.sort(function (a, b) {
  return traColl.compare(a,b);
}));

console.log('reformed:', refColl.resolved.requestedLocale + ' -> ' + refColl.resolved.collation, surnames.sort(function (a, b) {
  return refColl.compare(a,b);
}));

console.log('default:', defColl.resolved.requestedLocale + ' -> ' + defColl.resolved.collation, surnames.sort(function (a, b) {
  return defColl.compare(a,b);
}));

输出:

traditional: fi-u-co-trad -> trad ["Vatanen", "Watanen", "Virtanen"]
reformed: fi-u-co-reformed -> reformed ["Vatanen", "Virtanen", "Watanen"]
default: fi -> default ["Vatanen", "Virtanen", "Watanen"]

在 Google Chrome 中测试过,根据我在网上看到的,它在这方面落后于 Firefox。

关于javascript - 在 Javascript 中基于语言环境的排序,以预定义的方式对重音字母和其他变体进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624532/

有关javascript - 在 Javascript 中基于语言环境的排序,以预定义的方式对重音字母和其他变体进行排序的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  4. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  5. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  6. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  9. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  10. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

随机推荐