什么是代理对?

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)

据我所知,上面的代码是检查字符串的长度,但不考虑代理对.所以:

  1. 我对代码的理解是否正确?

  2. 什么是代理对?

到目前为止,我只知道这与编码有关.

idm*_*ean 7

  1. 是.你的理解是正确的.该函数返回Unicode代码点中字符串的长度.

  2. 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


Era*_*gev 5

对于第二个问题: 1. Java中的“代理对”是什么? 术语“代理对”是指在 UTF-16 编码方案中对具有高代码点的 Unicode 字符进行编码的方法。

在 Unicode 字符编码中,字符映射到 0x0 到 0x10FFFF 之间的值。

在内部,Java 使用 UTF-16 编码方案来存储 Unicode 文本的字符串。在 UTF-16 中,使用 16 位(两字节)代码单元。由于 16 位只能包含从 0x0 到 0xFFFF 的字符范围,因此需要使用一些额外的复杂性来存储高于此范围(0x10000 到 0x10FFFF)的值。这是通过使用称为代理的代码单元对来完成的。

代理代码单元处于称为“低代理”和“高代理”的两个范围内,具体取决于它们是否被允许出现在两个代码单元序列的开头或结尾。

  1. https://msdn.microsoft.com/en-us/library/windows/desktop/dd374069%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

希望这可以帮助。