Nom*_*man 2 javascript string encoding utf string-length
我在一个javascript开源项目中遇到了这段代码.
validator.isLength = function (str, min, max)
// match surrogate pairs in string or declare an empty array if none found in string
var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
// subtract the surrogate pairs string length from main string length
var len = str.length - surrogatePairs.length;
// now compare string length with min and max ... also make sure max is defined(in other words, max param is optional for function)
return len >= min && (typeof max === 'undefined' || len <= max);
};
Run Code Online (Sandbox Code Playgroud)
据我所知,上面的代码是检查字符串的长度,但不考虑代理对.所以:
我对代码的理解是否正确?
什么是代理对?
到目前为止,我只知道这与编码有关.
是.你的理解是正确的.该函数返回Unicode代码点中字符串的长度.
JavaScript使用UTF-16对其字符串进行编码.这意味着两个字节(16位)用于表示一个Unicode字符.
现在Unicode中的字符(如Emojis)具有高代码点,因此它们不能存储在2个字节(16位)中,因此需要将它们编码为2个UTF-16字符(4个字节).这些被称为代理对.
试试这个
var len = "".length // There is an emoji in the string (if you don’t see it)
Run Code Online (Sandbox Code Playgroud)
VS
var str = ""
var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
var len = str.length - surrogatePairs.length;
Run Code Online (Sandbox Code Playgroud)
在第一个例子len中将是2,因为表情符号由两个2个UTF-16字符组成.在第二个例子len中将是1.
你可能想要阅读 绝对最低每个软件开发人员,绝对必须知道关于Unicode和字符集(没有借口!)作者Joel Spolsky
对于第二个问题: 1. Java中的“代理对”是什么? 术语“代理对”是指在 UTF-16 编码方案中对具有高代码点的 Unicode 字符进行编码的方法。
在 Unicode 字符编码中,字符映射到 0x0 到 0x10FFFF 之间的值。
在内部,Java 使用 UTF-16 编码方案来存储 Unicode 文本的字符串。在 UTF-16 中,使用 16 位(两字节)代码单元。由于 16 位只能包含从 0x0 到 0xFFFF 的字符范围,因此需要使用一些额外的复杂性来存储高于此范围(0x10000 到 0x10FFFF)的值。这是通过使用称为代理的代码单元对来完成的。
代理代码单元处于称为“低代理”和“高代理”的两个范围内,具体取决于它们是否被允许出现在两个代码单元序列的开头或结尾。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
4080 次 |
| 最近记录: |