- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天,我偶然发现了 JavaScript/ECMAScript 国际化 API 的一个奇怪问题,我无法在任何地方找到合适的解释。比较两个特定字符时我得到不同的结果 - 正斜杠 (/
) 和下划线 (_
) 字符使用:
Intl.Collator.prototype.compare()
方法// Vanilla JavaScript comparator
const cmp = (a, b) => a < b ? -1 : a > b ? 1 : 0;
console.log(cmp('/', '_'));
// Output: -1
// When sorting
const result = ['/', '_'].sort(cmp);
console.log(result);
// Output: ['/', '_']
Intl.Collator.prototype.compare()
方法const collator = new Intl.Collator('en', {
sensitivity: 'base',
numeric: true
});
console.log(collator.compare('/', '_'));
// Output: 1
// When sorting
const result = ['/', '_'].sort(collator.compare);
console.log(result);
// Output: ['_', '/']
为什么这两种技术会产生不同的结果?这是 ECMAScript 实现中的错误吗?我在这里遗漏/未能理解什么?是否有其他此类字符组合会针对英语 (en
) 语言/区域设置产生不同的结果?
正如@t-j-crowder 指出的那样,将所有“ASCII”替换为“UTF-16”。
最佳答案
当您使用 <
时和 >
在字符串上,它们根据 UTF-16 代码单元值进行比较(不是 ASCII,但 ASCII 与许多常见字符的这些值重叠)。委婉地说,这是有问题的。例如,问法国人是否 "z" < "é"
应该真的是真的(表明 z
在 é
之前):
console.log("z" < "é"); // true?!?!
当您使用 Intl.Collator.prototype.compare
时,它根据您提供的选项为您的语言环境使用适当的排序规则(松散地排序)。在许多情况下,这可能与 UTF-16 代码单元值的结果不同。例如,即使在 en
中语言环境,Collator
返回 z
更合理的结果之后 é
:
console.log(new Intl.Collator("en").compare("z", "é")); // 1
_
和 /
特别是我不能具体告诉你为什么_
和 /
与 en
中的 UTF-16 代码单元有不同的顺序您正在使用的语言环境(以及我正在使用的语言环境),无论它是 en-US
, en-UK
, 或者是其他东西。但是发现它们在 ASCII 和 Unicode 之间的顺序不同也就不足为奇了。 (请记住,_
和 /
的 UTF-16 代码单元值来自它们的 ASCII 值。)
ASCII 的顺序是在 1960 年代早期精心设计的(a PDF 对此进行了精彩的详细介绍),但除了A-Z 和 0-9 的排序。 /
是 1963 年的原始 ASCII。_
直到 1967 年才被添加到可用位置之一,该位置的数值高于 /
.可能没有比 _
更重要的原因了。晚于/高于(数字)/
在 ASCII 中。
Unicode 的整理顺序是在 1990 年代(一直到今天)根据不同的目标(包括语言目标)、设计要求和设计约束精心设计的。据我所知(我不是 Unicode 专家),Unicode 的整理由 TR10 描述。和 TR35 的第 5 部分.我还没有找到为什么 _
的具体理由在 /
之前在根排序规则中(en
使用根排序规则)。我确定它在某处。我确实注意到它的一个方面似乎是按类别分组。 _
的类别是“连接标点符号”,而 /
的类别是“其他标点符号”。也许这与为什么 /
有关晚于 _
.
但根本的答案是:它们之所以不同,是因为 ASCII 的排序和 Unicode 整理是根据不同的约束和要求设计的。
关于javascript - 为什么 JavaScript `Intl.Collator.prototype.compare()` 方法会产生与特殊字符的传统 UTF-16 比较不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69405786/
我有两个表:tab1 和 tab2。每个表只有一个 VARCHAR(MAX) 列。 我只需要获取那些值对,它们是相等的,但只有大小写不同。 示例输入: tab1.t1 tab2.t2 ----
我正在尝试通过执行 [[self navigationController] popViewControllerAnimated:YES] 来“自毁” View Controller 。 在我这样做之
我在开发存储过程时收到此错误 Implicit conversion of varchar value to varchar cannot be performed because the colla
我正在浏览ICU源代码(http://icu-project.org/),但是找不到用于排序的开箱即用语言。有人可以帮我吗? 最佳答案 编辑:请注意,此列表是几年前写的。单击链接以获取更新的列表。 C
django==1.11.9 mysql版本5.6.38 +----------------------+-----------------+ | Variable_name | Val
我们使用 couchbase 作为我们的 nosql 存储并喜欢它的功能。 然而,我们在创建关联时遇到了一个问题 通过 View 整理。这可以被认为类似于连接操作。 虽然我们的数据集是 secret
cmp operator适用于代码编号,或者至少我认为它是这样做的,因为文档没有明确说明并且没有提及任何本地化内容。 我可以让它按其他排序规则排序吗?我知道我告诉 sort如何比较,但我认为它必须已经
我需要捕获 Windows 计算机已设置的打印机驱动程序设置,以确定它们是否已为特定打印机打开逐份打印功能。 我知道如何使用传入 DC_COLLATE 的 DeviceCapability 调用来获取
我刚刚开始学习Phinx,我需要将列的排序规则更改为latin1_swedish_ci。我没有找到有关如何执行此操作的文档。我假设它类似于: ->addColumn('text_two', 'stri
我在 SQL Server 2008 R2 dev 上,服务器默认排序规则是 Cyrillic_General_CI_AS 在 SSMS 中执行 选择 'éÉâÂàÀëËçæà' COLLATE La
我收到以下错误消息 [Err] 1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,C
我刚刚导出了一个 MySQL 数据库,以便在另一台服务器上复制它。查看 sql 脚本,我看到以下内容: CREATE TABLE `X` ( `id` int(11) unsigned NOT N
MYSQL 数据库 数据库 1 - 表 - 表 1 id - 整数 标题 - utf8_general_ci 值(value)观 - 1、Bienvenue Chez les Châtis 2、基础知
当我使用 phpMyAdmin 查看我的在线表格时,它使用整理方法“latin_swedish_ce”。为什么?默认值是多少?以及,使用什么整理方法? 最佳答案 MySQL 中的一个字符串有一个cha
我有一个名为 username 的列,我希望用户能够插入日语、罗马语、阿拉伯语、韩语以及所有可能的文本,包括特殊字符 [ https://en.wiktionary.org/wiki/Index:Al
我想比较 SQLite 数据库中的两个字符串而不关心重音和大小写。我的意思是“Événement”应该等于“evenèment”。 在 Debian Wheezy 上,SQLite 包不提供 ICU。
我在本地机器上使用提供的 COLLATE 值进行排序时遇到问题(在服务器上一切正常)。似乎没有任何效果。 使用 en_US COLLATE 的示例 SQL 代码: SELECT username FR
在 Microsoft SQL Server 中,如果我想在区分大小写的数据库中不区分大小写搜索,可以运行以下 SQL: SELECT * FROM MyTable WHERE MyField = '
我正在使用 mongoose paginate v2 从版本 3.2.7 的 mongodb 集合中检索文档。 var options = { page, limit }; Schema.pagina
有没有办法在 SQLITE 中使用“IN”子句,该子句将敏感地将列与 in 子句中的所有元素进行匹配。我有一个疑问 select * from Table where table.column in
我是一名优秀的程序员,十分优秀!