Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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 测试按en us utf8排序的字符串时的localeCompare_Javascript_Node.js_Locale - Fatal编程技术网

Javascript 测试按en us utf8排序的字符串时的localeCompare

Javascript 测试按en us utf8排序的字符串时的localeCompare,javascript,node.js,locale,Javascript,Node.js,Locale,我想使用localeCompare测试通过Postgres排序的字符串 正在使用的排序规则是en_US.utf8 当我使用localeCompare测试降序和升序排序时,它给出了错误的结果。我可以传递给localeCompare什么区域设置来正确处理此问题 例如: 递减:“负面结果”。localeCompare(“一个sollicitudin orci”)=1 升序:“amet-lorem semper auctor.”localeCompare(“一个sollicitudin orci”)=1

我想使用localeCompare测试通过Postgres排序的字符串

正在使用的排序规则是en_US.utf8

当我使用localeCompare测试降序和升序排序时,它给出了错误的结果。我可以传递给localeCompare什么区域设置来正确处理此问题

例如:

递减:“负面结果”。localeCompare(“一个sollicitudin orci”)=1


升序:“amet-lorem semper auctor.”localeCompare(“一个sollicitudin orci”)=1

不幸的是,您无法将任何参数传递给localeCompare以使其与Postgres的en_US.UTF-8排序匹配

Postgres遵循Unicode排序算法的实现,该算法记录在此处:

相比之下,localeCompare使用Intl.Collator对象的“CompareStrings”操作。根据规范,“以实现定义的方式比较这两个字符串。”()。该规范建议实现使用Unicode排序算法,但这只是一个建议,虽然我不确定不同的浏览器到底在做什么,但我已经在Mac上的Chrome上做了足够的实证测试,以确保无论它在做什么,它都与Postgres的实现非常不同

我目前不知道有任何库将Unicode排序算法移植到javascript

所以。如果您绝对需要一个与Postgres排序完全匹配的浏览器端算法,这是生死攸关的,那么我认为您唯一的选择就是查看spec(),可能还有Postgres的源代码,并将其移植到javascript

规范非常密集和复杂,因此实用的方法可能是开发一个足够好的算法,大部分时间匹配Postgres,并让您的应用程序优雅地处理角落情况。我找到的最有用的资源是这个答案,它提供了一个使用拉丁1排序表的算法的简单实现,可能适合使用UTF8


就我而言,我还没有走那条路。我编写了一个更粗糙的算法:a)首先从两个字符串中去掉特殊字符,如空格和符号,然后使用localeCompare与“en-US”进行比较;b)为了打破关系,使用localeCompare比较原始字符串。这是非常粗糙的(我有几个测试用例,我知道它不起作用),但在实践中,至少90%的实际使用情况下,它似乎产生了与Postgres相同的结果。

在哪种语言中,您希望这些比较返回负数?因此升序应该是-1,因为第二个字符串中的空格“小于”第一个字符串中的m。该语言将使用英语。我尝试将“en US.utf8”传递给localeCompare,但返回一个错误。通过交换字符串指定是升序还是降序:
“a sollicitudin orci”。localeCompare(“amet-lorem semper auctor.”)=-1