From 490c2cd4a63e387ac6e6eebeafde04b90432fd35 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Mon, 31 Oct 2022 10:55:06 +0800 Subject: [PATCH 01/64] feat: translation for article `Unicode, String internals` --- 1-js/99-js-misc/06-unicode/article.md | 131 +++++++++++++------------- 1 file changed, 65 insertions(+), 66 deletions(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 4f144f824..8259ef076 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -1,165 +1,164 @@ +# Unicode —— 字符串的内部原理 -# Unicode, String internals - -```warn header="Advanced knowledge" -The section goes deeper into string internals. This knowledge will be useful for you if you plan to deal with emoji, rare mathematical or hieroglyphic characters, or other rare symbols. +```warn header="进阶知识" +本节将更深入地介绍字符串的内部原理。 如果你打算处理表情符号(emoji)、稀有的数学、象形文字字符或其他稀有符号,这些知识将对你很有用。 ``` -As we already know, JavaScript strings are based on [Unicode](https://en.wikipedia.org/wiki/Unicode): each character is represented by a byte sequence of 1-4 bytes. +正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的:每一个字符是用 1-4 字节长度的字节序列表示的。 -JavaScript allows us to insert a character into a string by specifying its hexadecimal Unicode code with one of these three notations: +JavaScript 允许我们使用下述三种表示方法之一指定十六进制 Unicode 码以将一个字符插入到字符串里。 - `\xXX` - `XX` must be two hexadecimal digits with a value between `00` and `FF`, then `\xXX` is the character whose Unicode code is `XX`. + `XX` 必须是介于 `00` 与 `FF` 之间的两位十六进制数, 此时, `\xXX` 便表示 Unicode 码为 `XX 的字符。 - Because the `\xXX` notation supports only two hexadecimal digits, it can be used only for the first 256 Unicode characters. + 因为 `\xXX` 符号只支持两位十六进制数,所以它只能用于前 256 个 Unicode 字符。 - These first 256 characters include the Latin alphabet, most basic syntax characters, and some others. For example, `"\x7A"` is the same as `"z"` (Unicode `U+007A`). + 这前 256 个字符包括拉丁字母、最基本的语法字符和其他一些字符。 例如,`"\x7A"` 与 `"z"` (Unicode 为 `U+007A`) 是同一个字符。 ```js run alert( "\x7A" ); // z - alert( "\xA9" ); // ©, the copyright symbol + alert( "\xA9" ); // © (版权符号) ``` - `\uXXXX` - `XXXX` must be exactly 4 hex digits with the value between `0000` and `FFFF`, then `\uXXXX` is the character whose Unicode code is `XXXX`. + `XXXX` 必须是 4 位十六进制数,值介于 `0000` 和 `FFFF` 之间。此时, `\uXXXX` 便表示为 Unicode 代码为 `XXXX` 的字符。 - Characters with Unicode values greater than `U+FFFF` can also be represented with this notation, but in this case, we will need to use a so called surrogate pair (we will talk about surrogate pairs later in this chapter). + Unicode 值大于 `U+FFFF` 的字符也可以用这种表示法来表示,但在这种情况下,我们要用到所谓的代理对(我们将在本章的后面讨论代理对)。 ```js run - alert( "\u00A9" ); // ©, the same as \xA9, using the 4-digit hex notation - alert( "\u044F" ); // я, the Cyrillic alphabet letter - alert( "\u2191" ); // ↑, the arrow up symbol + alert( "\u00A9" ); // ©, 等同于使用了四位十六进制数表示法的 \xA9 + alert( "\u044F" ); // я(西里尔字母) + alert( "\u2191" ); // ↑(上箭头符号) ``` - `\u{X…XXXXXX}` - `X…XXXXXX` must be a hexadecimal value of 1 to 6 bytes between `0` and `10FFFF` (the highest code point defined by Unicode). This notation allows us to easily represent all existing Unicode characters. + `X...XXXXXX` 必须是介于 `0` 和 `10FFFF`(Unicode 定义的最高码位)之间的 1 到 6 个字节的十六进制值。 这种表示法使我们能够轻松地表示所有现有的 Unicode 字符。 ```js run - alert( "\u{20331}" ); // 佫, a rare Chinese character (long Unicode) - alert( "\u{1F60D}" ); // 😍, a smiling face symbol (another long Unicode) + alert( "\u{20331}" ); // 佫, 一个不常见的中文字符 (长 Unicode) + alert( "\u{1F60D}" ); // 😍, 一个微笑符号 (另一个长 Unicode) ``` -## Surrogate pairs +## 代理对 -All frequently used characters have 2-byte codes (4 hex digits). Letters in most European languages, numbers, and the basic unified CJK ideographic sets (CJK -- from Chinese, Japanese, and Korean writing systems), have a 2-byte representation. +所有常用字符都有 2 字节代码(4 个十六进制数字)。 大多数欧洲语言的字母,数字,以及基本统一了的 CJK 表意文字集(CJK——来自中文、日文和韩文书写系统)中的字母用 2 字节表示。 -Initially, JavaScript was based on UTF-16 encoding that only allowed 2 bytes per character. But 2 bytes only allow 65536 combinations and that's not enough for every possible symbol of Unicode. +最初,JavaScript 基于 UTF-16 编码,只允许每个字符占 2 个字节长度。 但是 2 个字节只允许 65536 种组合,这对于 Unicode 里每个可能符的号来说,是不够的。 -So rare symbols that require more than 2 bytes are encoded with a pair of 2-byte characters called "a surrogate pair". +因此,需要超过 2 个字节的稀有符号使用一对 2 字节字符编码,称为“代理对”(surrogate pair)。 -As a side effect, the length of such symbols is `2`: +这种做也有副作用——这些符号的长度是 `2`: ```js run -alert( '𝒳'.length ); // 2, MATHEMATICAL SCRIPT CAPITAL X -alert( '😂'.length ); // 2, FACE WITH TEARS OF JOY -alert( '𩷶'.length ); // 2, a rare Chinese character +alert( '𝒳'.length ); // 2, 大写的数学符号 X +alert( '😂'.length ); // 2, 笑哭的表情 +alert( '𩷶'.length ); // 2, 一个少见的中文字符 ``` -That's because surrogate pairs did not exist at the time when JavaScript was created, and thus are not correctly processed by the language! +这是因为在 JavaScript 被创造出来的时候,代理对这个概念并不存在,因此语言并没有正确处理它们! -We actually have a single symbol in each of the strings above, but the `length` property shows a length of `2`. +虽然上面的每个字符串都只有一个符号显示,但是 `length` 属性显示的长度为 `2`。 -Getting a symbol can also be tricky, because most language features treat surrogate pairs as two characters. +要想获取这些符号,也是一个棘手的问题:在大多数语言特性里,代理对是被当成两个单独的字符对待的。 -For example, here we can see two odd characters in the output: +举个例子,我们可以在输出中看到两个奇数字符: ```js run -alert( '𝒳'[0] ); // shows strange symbols... -alert( '𝒳'[1] ); // ...pieces of the surrogate pair +alert( '𝒳'[0] ); // 显示出了一个奇怪的符号... +alert( '𝒳'[1] ); // ...代理对的片段 ``` -Pieces of a surrogate pair have no meaning without each other. So the alerts in the example above actually display garbage. +代理对被分开后,就失去意义了。 所以上面示例中,由 `alert()` 打印出的内容,其实就是没有任何意义的垃圾。 -Technically, surrogate pairs are also detectable by their codes: if a character has the code in the interval of `0xd800..0xdbff`, then it is the first part of the surrogate pair. The next character (second part) must have the code in interval `0xdc00..0xdfff`. These intervals are reserved exclusively for surrogate pairs by the standard. +从技术层面上讲,可以通过代码来检测到代理对的存在:如果一个字符的代码在 `0xd800..0xdbff` 这个区间内,那么它就是代理对的前一部分。 下一个字符(第二部分)的代码必须在区间 `0xdc00..0xdfff` 内。 这些预留的区间是标准专门为代理对制定的, -So the methods [String.fromCodePoint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint) and [str.codePointAt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) were added in JavaScript to deal with surrogate pairs. +所以,方法 [String.fromCodePoint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint) 和 [str.codePointAt](https://developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) 被添加到 JavaScript,以处理代理对。 -They are essentially the same as [String.fromCharCode](mdn:js/String/fromCharCode) and [str.charCodeAt](mdn:js/String/charCodeAt), but they treat surrogate pairs correctly. +它们本质上与 [String.fromCharCode](mdn:js/String/fromCharCode) 和 [str.charCodeAt](mdn:js/String/charCodeAt) 相同,但它们可以正确地处理代理对。 -One can see the difference here: +在这里可以看出它们的区别: ```js run -// charCodeAt is not surrogate-pair aware, so it gives codes for the 1st part of 𝒳: +// charCodeAt 不会注意到代理对的存在, 所以返回了 𝒳 前半部分的代码: alert( '𝒳'.charCodeAt(0).toString(16) ); // d835 -// codePointAt is surrogate-pair aware -alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, reads both parts of the surrogate pair +// codePointAt 会注意到代理对的存在 +alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, 读取到了完整的代理对 ``` -That said, if we take from position 1 (and that's rather incorrect here), then they both return only the 2nd part of the pair: +也就是说,如果我们从字符串的位置 1 开始获取 `charCode` 与 `codePoint` (这么做是不对的),那么这两个方法调用后,都只返回了该代理对的后半部分: ```js run alert( '𝒳'.charCodeAt(1).toString(16) ); // dcb3 alert( '𝒳'.codePointAt(1).toString(16) ); // dcb3 -// meaningless 2nd half of the pair +// 无意义的代理对后半部分 ``` -You will find more ways to deal with surrogate pairs later in the chapter . There are probably special libraries for that too, but nothing famous enough to suggest here. +你将会在 一章找到更多处理代理对的方法。 如今可能会有专门处理代理对的库,但没有足够流行到让我们可以在这里安利的库。 -````warn header="Takeaway: splitting strings at an arbitrary point is dangerous" -We can't just split a string at an arbitrary position, e.g. take `str.slice(0, 4)` and expect it to be a valid string, e.g.: +````warn header="注意:在任意点拆分字符串是危险的" +我们不能只在任意位置拆分字符串,例如 从 `str.slice(0, 4)` 取出一个字符串,并期待它是一个有效的字符串,例如: ```js run alert( 'hi 😂'.slice(0, 4) ); // hi [?] ``` -Here we can see a garbage character (first half of the smile surrogate pair) in the output. +在这里,我们看到一个没有意义的垃圾字符被打印了出来(微笑表情代理对的前半部分)。 -Just be aware of it if you intend to reliably work with surrogate pairs. May not be a big problem, but at least you should understand what happens. +如果你打算可靠地使用代理对,请注意这一点。 这可能并不是什么大问题,但至少你应该得明白什么会发生。 ```` -## Diacritical marks and normalization +## 变音符号与规范化 -In many languages, there are symbols that are composed of the base character with a mark above/under it. +许多语言会有由基本字符以及上标记/下标记组成的符号。 -For instance, the letter `a` can be the base character for these characters: `àáâäãåā`. +举个例子,`àáâäãåā` 这些字符是基于字母 `a` 得来的。 -Most common "composite" characters have their own code in the Unicode table. But not all of them, because there are too many possible combinations. +常见的“复合”字符在 Unicode 表中都有自己的代码。 但不是所有这些字符都有自己的代码,因为可能的组合有太多了。 -To support arbitrary compositions, the Unicode standard allows us to use several Unicode characters: the base character followed by one or many "mark" characters that "decorate" it. +为了支持任意的组合,Unicode 标准允许我们使用多个 Unicode 字符:基本字符后跟一个或多个“装饰”它的“标记”字符。 -For instance, if we have `S` followed by the special "dot above" character (code `\u0307`), it is shown as Ṡ. +例如,如果我们在 `S` 后跟特殊的“上句点”字符(代码为 `\u0307`),则显示为 Ṡ。 ```js run alert( 'S\u0307' ); // Ṡ ``` -If we need an additional mark above the letter (or below it) -- no problem, just add the necessary mark character. +我们只需添加必要的标记字符,便可在字母上方(或下方)添加额外的标记。 -For instance, if we append a character "dot below" (code `\u0323`), then we'll have "S with dots above and below": `Ṩ`. +例如,如果我们附加一个字符“下句点”(代码 `\u0323`),那么我们将得到“有上下句点的 S”:`Ṩ`。 -For example: +如下代码所示: ```js run alert( 'S\u0307\u0323' ); // Ṩ ``` -This provides great flexibility, but also an interesting problem: two characters may visually look the same, but be represented with different Unicode compositions. +这非常灵活,但也带来了一个有趣的问题:两个字符在我们眼里看起来虽然相同,却用着不同的 Unicode 组合表示。 -For instance: +举个例子: ```js run -let s1 = 'S\u0307\u0323'; // Ṩ, S + dot above + dot below -let s2 = 'S\u0323\u0307'; // Ṩ, S + dot below + dot above +let s1 = 'S\u0307\u0323'; // Ṩ, S + 上句点 + 下句点 +let s2 = 'S\u0323\u0307'; // Ṩ, S + 下句点 + 上句点 alert( `s1: ${s1}, s2: ${s2}` ); -alert( s1 == s2 ); // false though the characters look identical (?!) +alert( s1 == s2 ); // 这两个字符在我们眼里看起来是相同的,却打印出了 false(?!) ``` -To solve this, there exists a "Unicode normalization" algorithm that brings each string to the single "normal" form. +“Unicode 规范化”算法可以解决问题,该算法将每个字符串转换为单一的“正常”形式。 -It is implemented by [str.normalize()](mdn:js/String/normalize). +[str.normalize()](mdn:js/String/normalize) 实现了该算法。 ```js run alert( "S\u0307\u0323".normalize() == "S\u0323\u0307".normalize() ); // true ``` -It's funny that in our situation `normalize()` actually brings together a sequence of 3 characters to one: `\u1e68` (S with two dots). +有意思的是,`normalize()` 将 3 个字符的序列组合在了一起:`\u1e68`(带有上下两个点的 S)。 ```js run alert( "S\u0307\u0323".normalize().length ); // 1 @@ -167,6 +166,6 @@ alert( "S\u0307\u0323".normalize().length ); // 1 alert( "S\u0307\u0323".normalize() == "\u1e68" ); // true ``` -In reality, this is not always the case. The reason is that the symbol `Ṩ` is "common enough", so Unicode creators included it in the main table and gave it the code. +但实际并非总是如此。 原因是符号 `Ṩ` 是“足够常见的”,因此 Unicode 创建者将其包含在主表里,并为其提供了代码。 -If you want to learn more about normalization rules and variants -- they are described in the appendix of the Unicode standard: [Unicode Normalization Forms](https://www.unicode.org/reports/tr15/), but for most practical purposes the information from this section is enough. +如果您想了解更多关于 Unicode 规范化规则和变体的信息,可以参阅 Unicode 标准的附录:[Unicode 规范化形式](https://www.unicode.org/reports/tr15/)。但就实用而言,本节中的信息就已经足够了。 From 0c35ef2e46d0b85c5b272e02ddc2d3b19123fa9e Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 31 Oct 2022 12:56:22 +0800 Subject: [PATCH 02/64] Update article.md --- 1-js/99-js-misc/06-unicode/article.md | 1 + 1 file changed, 1 insertion(+) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 8259ef076..4432f3b0b 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -1,3 +1,4 @@ + # Unicode —— 字符串的内部原理 ```warn header="进阶知识" From 6c8ef3bd872e8247d4759c30b676956d552a216a Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:01:26 +0800 Subject: [PATCH 03/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 4432f3b0b..39c4930f0 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -62,7 +62,7 @@ alert( '𩷶'.length ); // 2, 一个少见的中文字符 虽然上面的每个字符串都只有一个符号显示,但是 `length` 属性显示的长度为 `2`。 -要想获取这些符号,也是一个棘手的问题:在大多数语言特性里,代理对是被当成两个单独的字符对待的。 +要想获取这些符号,也是一个棘手的问题:在大多数编程语言里,代理对是被当成两个单独的字符对待的。 举个例子,我们可以在输出中看到两个奇数字符: From df26bc5f28fc986fe30b91d189215d8f4933cefb Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:01:57 +0800 Subject: [PATCH 04/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 39c4930f0..da78cb60b 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -86,7 +86,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 alert( '𝒳'.charCodeAt(0).toString(16) ); // d835 -// codePointAt 会注意到代理对的存在 +// codePointAt 会正确处理代理对 alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, 读取到了完整的代理对 ``` From a6ce58ca39d1fe1ee8d9ebac4b4a549350c6be81 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:02:06 +0800 Subject: [PATCH 05/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index da78cb60b..08595ebe3 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -82,7 +82,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 在这里可以看出它们的区别: ```js run -// charCodeAt 不会注意到代理对的存在, 所以返回了 𝒳 前半部分的代码: +// charCodeAt 不会考虑代理对, 所以返回了 𝒳 前半部分的代码: alert( '𝒳'.charCodeAt(0).toString(16) ); // d835 From 9228c347236de7d7abb903470425f392a7af11d5 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:02:24 +0800 Subject: [PATCH 06/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 08595ebe3..03dd3cc41 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -44,7 +44,7 @@ JavaScript 允许我们使用下述三种表示方法之一指定十六进制 Un ## 代理对 -所有常用字符都有 2 字节代码(4 个十六进制数字)。 大多数欧洲语言的字母,数字,以及基本统一了的 CJK 表意文字集(CJK——来自中文、日文和韩文书写系统)中的字母用 2 字节表示。 +所有常用字符都有 2 字节编码(4 个十六进制数字)。 大多数欧洲语言的字母,数字,以及基本统一的 CJK 表意文字集(CJK——来自中文、日文和韩文书写系统)中的字母用 2 字节表示。 最初,JavaScript 基于 UTF-16 编码,只允许每个字符占 2 个字节长度。 但是 2 个字节只允许 65536 种组合,这对于 Unicode 里每个可能符的号来说,是不够的。 From 52ab26fd2f06e30da61daa74e7a912823e92707d Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:02:47 +0800 Subject: [PATCH 07/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 03dd3cc41..61da443e7 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -23,7 +23,7 @@ JavaScript 允许我们使用下述三种表示方法之一指定十六进制 Un ``` - `\uXXXX` - `XXXX` 必须是 4 位十六进制数,值介于 `0000` 和 `FFFF` 之间。此时, `\uXXXX` 便表示为 Unicode 代码为 `XXXX` 的字符。 + `XXXX` 必须是 4 位十六进制数,值介于 `0000` 和 `FFFF` 之间。此时, `\uXXXX` 便表示 Unicode 代码为 `XXXX` 的字符。 Unicode 值大于 `U+FFFF` 的字符也可以用这种表示法来表示,但在这种情况下,我们要用到所谓的代理对(我们将在本章的后面讨论代理对)。 From 642e1105a385c37497f4e75980501d1bc56fcf8a Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:03:25 +0800 Subject: [PATCH 08/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 61da443e7..211b0b77f 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -7,7 +7,7 @@ 正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的:每一个字符是用 1-4 字节长度的字节序列表示的。 -JavaScript 允许我们使用下述三种表示方法之一指定十六进制 Unicode 码以将一个字符插入到字符串里。 +JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六进制表示插入到字符串中。 - `\xXX` From 5a58e0a4d4d4536475b88c32bdf3e5b743bfe1b3 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:03:45 +0800 Subject: [PATCH 09/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 211b0b77f..b9b621643 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -11,7 +11,7 @@ JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六 - `\xXX` - `XX` 必须是介于 `00` 与 `FF` 之间的两位十六进制数, 此时, `\xXX` 便表示 Unicode 码为 `XX 的字符。 + `XX` 必须是介于 `00` 与 `FF` 之间的两位十六进制数, `\xXX` 表示 Unicode 码为 `XX` 的字符。 因为 `\xXX` 符号只支持两位十六进制数,所以它只能用于前 256 个 Unicode 字符。 From f7c350208d1e7292d492f045333360cfe8392fd7 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:05:07 +0800 Subject: [PATCH 10/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index b9b621643..e3c6b7433 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -25,7 +25,7 @@ JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六 - `\uXXXX` `XXXX` 必须是 4 位十六进制数,值介于 `0000` 和 `FFFF` 之间。此时, `\uXXXX` 便表示 Unicode 代码为 `XXXX` 的字符。 - Unicode 值大于 `U+FFFF` 的字符也可以用这种表示法来表示,但在这种情况下,我们要用到所谓的代理对(我们将在本章的后面讨论代理对)。 + Unicode 值大于 `U+FFFF` 的字符也可以用这种方法来表示,但在这种情况下,我们要用到代理对(我们将在本章的后面讨论它)。 ```js run alert( "\u00A9" ); // ©, 等同于使用了四位十六进制数表示法的 \xA9 From 2c8657f387515176cab3dc3e510b0517a25cb5d4 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:05:27 +0800 Subject: [PATCH 11/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index e3c6b7433..132bea11c 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -73,7 +73,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 代理对被分开后,就失去意义了。 所以上面示例中,由 `alert()` 打印出的内容,其实就是没有任何意义的垃圾。 -从技术层面上讲,可以通过代码来检测到代理对的存在:如果一个字符的代码在 `0xd800..0xdbff` 这个区间内,那么它就是代理对的前一部分。 下一个字符(第二部分)的代码必须在区间 `0xdc00..0xdfff` 内。 这些预留的区间是标准专门为代理对制定的, +从技术层面上讲,可以通过代码来检测到代理对的存在:如果一个字符的代码在 `0xd800..0xdbff` 这个区间内,那么它就是代理对的前一部分。 下一个字符(第二部分)的代码必须在区间 `0xdc00..0xdfff` 内。 这些区间是标准专门为代理对预留的, 所以,方法 [String.fromCodePoint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint) 和 [str.codePointAt](https://developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) 被添加到 JavaScript,以处理代理对。 From 08cd0b5bd2122220d50f52c911b7ee998de22e0a Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:07:30 +0800 Subject: [PATCH 12/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 132bea11c..be38c939f 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -2,7 +2,7 @@ # Unicode —— 字符串的内部原理 ```warn header="进阶知识" -本节将更深入地介绍字符串的内部原理。 如果你打算处理表情符号(emoji)、稀有的数学、象形文字字符或其他稀有符号,这些知识将对你很有用。 +本节将更深入地介绍字符串的内部原理。 如果你打算处理表情符号(emoji)、罕见的数学、象形文字字符或其他稀有字符,这些知识将对你很有用。 ``` 正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的:每一个字符是用 1-4 字节长度的字节序列表示的。 From f7f6ca186b6c77ac302aa98d1a1043fb5bb895d9 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:11:20 +0800 Subject: [PATCH 13/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index be38c939f..2ec1fd3cb 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -15,7 +15,7 @@ JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六 因为 `\xXX` 符号只支持两位十六进制数,所以它只能用于前 256 个 Unicode 字符。 - 这前 256 个字符包括拉丁字母、最基本的语法字符和其他一些字符。 例如,`"\x7A"` 与 `"z"` (Unicode 为 `U+007A`) 是同一个字符。 + 这前 256 个字符包括拉丁字母、最基本的语法字符和其他一些字符。 例如,`"\x7A"` 表示 `"z"` (Unicode 为 `U+007A`) 。 ```js run alert( "\x7A" ); // z From 8c7ee119ddf9a21b9e32bbe817ebbd9e96d6523f Mon Sep 17 00:00:00 2001 From: situ2001 Date: Sun, 4 Dec 2022 18:13:41 +0800 Subject: [PATCH 14/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 2ec1fd3cb..5d5087d25 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -38,8 +38,8 @@ JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六 `X...XXXXXX` 必须是介于 `0` 和 `10FFFF`(Unicode 定义的最高码位)之间的 1 到 6 个字节的十六进制值。 这种表示法使我们能够轻松地表示所有现有的 Unicode 字符。 ```js run - alert( "\u{20331}" ); // 佫, 一个不常见的中文字符 (长 Unicode) - alert( "\u{1F60D}" ); // 😍, 一个微笑符号 (另一个长 Unicode) + alert( "\u{20331}" ); // 佫, 一个不常见的中文字符 + alert( "\u{1F60D}" ); // 😍, 一个微笑符号 ``` ## 代理对 From f8494abee8f3446ae1fce0ebcd32a05bddfb6309 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Mon, 5 Dec 2022 09:52:55 +0800 Subject: [PATCH 15/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 5d5087d25..bf7059ff6 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -5,7 +5,7 @@ 本节将更深入地介绍字符串的内部原理。 如果你打算处理表情符号(emoji)、罕见的数学、象形文字字符或其他稀有字符,这些知识将对你很有用。 ``` -正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的:每一个字符是用 1-4 字节长度的字节序列表示的。 +正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的。同时,每一个字符是用 1-4 字节长度的字节序列表示的。 JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六进制表示插入到字符串中。 From fe5b16c3c6c3988520243afd1f417813fb1f5a33 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Mon, 5 Dec 2022 09:53:01 +0800 Subject: [PATCH 16/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: Songhn --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index bf7059ff6..001e9c4e3 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -1,5 +1,5 @@ -# Unicode —— 字符串的内部原理 +# Unicode —— 字符串内幕 ```warn header="进阶知识" 本节将更深入地介绍字符串的内部原理。 如果你打算处理表情符号(emoji)、罕见的数学、象形文字字符或其他稀有字符,这些知识将对你很有用。 From f8d7b498e0d7a5b4973974b7c9ba6e8be9bd2f17 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:25:27 +0800 Subject: [PATCH 17/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 001e9c4e3..bc3ef146b 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -11,7 +11,7 @@ JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六 - `\xXX` - `XX` 必须是介于 `00` 与 `FF` 之间的两位十六进制数, `\xXX` 表示 Unicode 码为 `XX` 的字符。 + `XX` 必须是介于 `00` 与 `FF` 之间的两位十六进制数,`\xXX` 表示 Unicode 编码为 `XX` 的字符。 因为 `\xXX` 符号只支持两位十六进制数,所以它只能用于前 256 个 Unicode 字符。 From 09ce3bcda8c5f89c4a196aa23831e79077492e59 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:26:26 +0800 Subject: [PATCH 18/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index bc3ef146b..853cb821e 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -15,7 +15,7 @@ JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六 因为 `\xXX` 符号只支持两位十六进制数,所以它只能用于前 256 个 Unicode 字符。 - 这前 256 个字符包括拉丁字母、最基本的语法字符和其他一些字符。 例如,`"\x7A"` 表示 `"z"` (Unicode 为 `U+007A`) 。 + 这前 256 个字符包括拉丁字母、最基本的语法字符和其他一些字符。例如,`"\x7A"` 表示 `"z"` (Unicode 编码为 `U+007A`)。 ```js run alert( "\x7A" ); // z From cdf145071f4f5a3b7710f3f1261ca3f3c2ead8c3 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:27:12 +0800 Subject: [PATCH 19/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 853cb821e..9a8577ee3 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -2,7 +2,7 @@ # Unicode —— 字符串内幕 ```warn header="进阶知识" -本节将更深入地介绍字符串的内部原理。 如果你打算处理表情符号(emoji)、罕见的数学、象形文字字符或其他稀有字符,这些知识将对你很有用。 +本节将更深入地介绍字符串的内部原理。如果你打算处理表情符号(emoji)、罕见的数学或象形文字字符,或其他罕见字符,这些知识将对你很有用。 ``` 正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的。同时,每一个字符是用 1-4 字节长度的字节序列表示的。 From f311115e07b5a2e4e6a16ae00ffe39eec0b74ef0 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:28:02 +0800 Subject: [PATCH 20/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 9a8577ee3..75cdd2181 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -7,7 +7,7 @@ 正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的。同时,每一个字符是用 1-4 字节长度的字节序列表示的。 -JavaScript 允许我们使用下述三种方式将一个 Unicode 字符以十六进制表示插入到字符串中。 +JavaScript 允许我们通过下述三种表示方式之一将一个字符以其十六进制 Unicode 编码的方式插入到字符串中: - `\xXX` From 40abcda6f40baef364c9969e2ca2d290be336d87 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:28:23 +0800 Subject: [PATCH 21/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 75cdd2181..0beaed618 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -153,7 +153,7 @@ alert( s1 == s2 ); // 这两个字符在我们眼里看起来是相同的,却 “Unicode 规范化”算法可以解决问题,该算法将每个字符串转换为单一的“正常”形式。 -[str.normalize()](mdn:js/String/normalize) 实现了该算法。 +可以借助 [str.normalize()](mdn:js/String/normalize) 实现这一点。 ```js run alert( "S\u0307\u0323".normalize() == "S\u0323\u0307".normalize() ); // true From c6146260df404000596f5a0617534a8f7fd844d8 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:28:34 +0800 Subject: [PATCH 22/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 0beaed618..4d8804293 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -151,7 +151,7 @@ alert( `s1: ${s1}, s2: ${s2}` ); alert( s1 == s2 ); // 这两个字符在我们眼里看起来是相同的,却打印出了 false(?!) ``` -“Unicode 规范化”算法可以解决问题,该算法将每个字符串转换为单一的“正常”形式。 +“Unicode 规范化”算法可以解决这个问题,该算法将每个字符串转换为单一的“规范的”形式。 可以借助 [str.normalize()](mdn:js/String/normalize) 实现这一点。 From 3a831f0d68476d1c9b8b729ad8f2f28f4270f14b Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:28:59 +0800 Subject: [PATCH 23/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 4d8804293..290d59651 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -167,6 +167,6 @@ alert( "S\u0307\u0323".normalize().length ); // 1 alert( "S\u0307\u0323".normalize() == "\u1e68" ); // true ``` -但实际并非总是如此。 原因是符号 `Ṩ` 是“足够常见的”,因此 Unicode 创建者将其包含在主表里,并为其提供了代码。 +但实际并非总是如此。出现这种情况的原因是符号 `Ṩ` 是“足够常见的”,所以 Unicode 创建者将其囊括在了 Unicode 主表中,并为其提供了对应的编码。 如果您想了解更多关于 Unicode 规范化规则和变体的信息,可以参阅 Unicode 标准的附录:[Unicode 规范化形式](https://www.unicode.org/reports/tr15/)。但就实用而言,本节中的信息就已经足够了。 From c977355876fe0d3175d7bf644365ba8905cc0fc4 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:29:44 +0800 Subject: [PATCH 24/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 290d59651..413f577bb 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -159,7 +159,7 @@ alert( s1 == s2 ); // 这两个字符在我们眼里看起来是相同的,却 alert( "S\u0307\u0323".normalize() == "S\u0323\u0307".normalize() ); // true ``` -有意思的是,`normalize()` 将 3 个字符的序列组合在了一起:`\u1e68`(带有上下两个点的 S)。 +有意思的是,在我们这个例子中,`normalize()` 将 3 个字符的序列合并为了一个字符:`\u1e68`(带有上下两个点的 S)。 ```js run alert( "S\u0307\u0323".normalize().length ); // 1 From ed9c7c1c8beb2c9a4263495525159ddc5cd69a42 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:30:02 +0800 Subject: [PATCH 25/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 413f577bb..5c3eb444e 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -169,4 +169,4 @@ alert( "S\u0307\u0323".normalize() == "\u1e68" ); // true 但实际并非总是如此。出现这种情况的原因是符号 `Ṩ` 是“足够常见的”,所以 Unicode 创建者将其囊括在了 Unicode 主表中,并为其提供了对应的编码。 -如果您想了解更多关于 Unicode 规范化规则和变体的信息,可以参阅 Unicode 标准的附录:[Unicode 规范化形式](https://www.unicode.org/reports/tr15/)。但就实用而言,本节中的信息就已经足够了。 +如果你想了解关于 Unicode 规范化规则和变体的更多信息,可以参阅 Unicode 标准的附录中的内容:[Unicode 规范化形式](https://www.unicode.org/reports/tr15/)。但就实用而言,本节中的信息就已经足够了。 From ad22d8cadf650aefcb8cfa1a187e666b68813adb Mon Sep 17 00:00:00 2001 From: situ2001 Date: Wed, 21 Dec 2022 23:33:36 +0800 Subject: [PATCH 26/64] Update 1-js/99-js-misc/06-unicode/article.md Co-authored-by: LeviDing --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 5c3eb444e..6111abc98 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -5,7 +5,7 @@ 本节将更深入地介绍字符串的内部原理。如果你打算处理表情符号(emoji)、罕见的数学或象形文字字符,或其他罕见字符,这些知识将对你很有用。 ``` -正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的。同时,每一个字符是用 1-4 字节长度的字节序列表示的。 +正如我们所知,JavaScript 的字符串是基于 [Unicode](https://en.wikipedia.org/wiki/Unicode) 的:每个字符由 1-4 个字节的字节序列表示。 JavaScript 允许我们通过下述三种表示方式之一将一个字符以其十六进制 Unicode 编码的方式插入到字符串中: From 3c293813511cb547d7aefeeea5967b37639aa442 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:32:25 +0800 Subject: [PATCH 27/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 6111abc98..b4efac2e8 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -19,7 +19,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 ```js run alert( "\x7A" ); // z - alert( "\xA9" ); // © (版权符号) + alert( "\xA9" ); // © (版权符号) ``` - `\uXXXX` From 65a94d8eb5b4581404dc43e509e141794cbeed14 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:32:45 +0800 Subject: [PATCH 28/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index b4efac2e8..e95477016 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -23,7 +23,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 ``` - `\uXXXX` - `XXXX` 必须是 4 位十六进制数,值介于 `0000` 和 `FFFF` 之间。此时, `\uXXXX` 便表示 Unicode 代码为 `XXXX` 的字符。 + `XXXX` 必须是 4 位十六进制数,值介于 `0000` 和 `FFFF` 之间。此时,`\uXXXX` 便表示 Unicode 编码为 `XXXX` 的字符。 Unicode 值大于 `U+FFFF` 的字符也可以用这种方法来表示,但在这种情况下,我们要用到代理对(我们将在本章的后面讨论它)。 From 6938f5aa3d836ef5f932501ac669f15172e233ac Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:33:06 +0800 Subject: [PATCH 29/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index e95477016..0b2479982 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -35,7 +35,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 - `\u{X…XXXXXX}` - `X...XXXXXX` 必须是介于 `0` 和 `10FFFF`(Unicode 定义的最高码位)之间的 1 到 6 个字节的十六进制值。 这种表示法使我们能够轻松地表示所有现有的 Unicode 字符。 + `X…XXXXXX` 必须是介于 `0` 和 `10FFFF`(Unicode 定义的最高码位)之间的 1 到 6 个字节的十六进制值。这种表示方式让我们能够轻松地表示所有现有的 Unicode 字符。 ```js run alert( "\u{20331}" ); // 佫, 一个不常见的中文字符 From 0820f2d0ca22d90e986a453cd0f6aa2043a3b316 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:33:20 +0800 Subject: [PATCH 30/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 0b2479982..958b4cb51 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -44,7 +44,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 ## 代理对 -所有常用字符都有 2 字节编码(4 个十六进制数字)。 大多数欧洲语言的字母,数字,以及基本统一的 CJK 表意文字集(CJK——来自中文、日文和韩文书写系统)中的字母用 2 字节表示。 +所有常用字符都有对应的 2 字节长度的编码(4 位十六进制数)。大多数欧洲语言的字母、数字、以及基本统一的 CJK 表意文字集(CJK —— 来自中文、日文和韩文书写系统)中的字母,均有对应的 2 字节长度的 Unicode 编码。 最初,JavaScript 基于 UTF-16 编码,只允许每个字符占 2 个字节长度。 但是 2 个字节只允许 65536 种组合,这对于 Unicode 里每个可能符的号来说,是不够的。 From 749abf64efd33172c5429a860a9f8565e0bdef01 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:33:42 +0800 Subject: [PATCH 31/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 958b4cb51..ebc07167f 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -46,7 +46,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 所有常用字符都有对应的 2 字节长度的编码(4 位十六进制数)。大多数欧洲语言的字母、数字、以及基本统一的 CJK 表意文字集(CJK —— 来自中文、日文和韩文书写系统)中的字母,均有对应的 2 字节长度的 Unicode 编码。 -最初,JavaScript 基于 UTF-16 编码,只允许每个字符占 2 个字节长度。 但是 2 个字节只允许 65536 种组合,这对于 Unicode 里每个可能符的号来说,是不够的。 +最初,JavaScript 是基于 UTF-16 编码的,只允许每个字符占 2 个字节长度。但 2 个字节只允许 65536 种组合,这对于表示 Unicode 里每个可能符的号来说,是不够的。 因此,需要超过 2 个字节的稀有符号使用一对 2 字节字符编码,称为“代理对”(surrogate pair)。 From c966ee8ceeb34207b0134ca632b1149d4ecc207d Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:33:56 +0800 Subject: [PATCH 32/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index ebc07167f..6a44b5ad7 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -50,7 +50,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 因此,需要超过 2 个字节的稀有符号使用一对 2 字节字符编码,称为“代理对”(surrogate pair)。 -这种做也有副作用——这些符号的长度是 `2`: +这种做也有副作用 —— 这些符号的长度为 `2`: ```js run alert( '𝒳'.length ); // 2, 大写的数学符号 X From f265e7a4aa966dabcdb5178aed636ae1f393b0c3 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:34:15 +0800 Subject: [PATCH 33/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 6a44b5ad7..218a4a0ee 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -28,7 +28,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 Unicode 值大于 `U+FFFF` 的字符也可以用这种方法来表示,但在这种情况下,我们要用到代理对(我们将在本章的后面讨论它)。 ```js run - alert( "\u00A9" ); // ©, 等同于使用了四位十六进制数表示法的 \xA9 + alert( "\u00A9" ); // ©, 等同于 \xA9,只是使用了四位十六进制数表示而已 alert( "\u044F" ); // я(西里尔字母) alert( "\u2191" ); // ↑(上箭头符号) ``` From ead4d3336be54d66d4075d5bcab8d87835c67760 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:34:25 +0800 Subject: [PATCH 34/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 218a4a0ee..bbe972ac9 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -38,7 +38,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 `X…XXXXXX` 必须是介于 `0` 和 `10FFFF`(Unicode 定义的最高码位)之间的 1 到 6 个字节的十六进制值。这种表示方式让我们能够轻松地表示所有现有的 Unicode 字符。 ```js run - alert( "\u{20331}" ); // 佫, 一个不常见的中文字符 + alert( "\u{20331}" ); // 佫, 一个不常见的中文字符(长 Unicode) alert( "\u{1F60D}" ); // 😍, 一个微笑符号 ``` From cc8b652cd2eda3821b0e88843fa467a38ccd8aae Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:34:36 +0800 Subject: [PATCH 35/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index bbe972ac9..b84515c84 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -39,7 +39,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 ```js run alert( "\u{20331}" ); // 佫, 一个不常见的中文字符(长 Unicode) - alert( "\u{1F60D}" ); // 😍, 一个微笑符号 + alert( "\u{1F60D}" ); // 😍, 一个微笑符号(另一个长 Unicode) ``` ## 代理对 From 0d17704762d7a5b05f2251fc809366a79481199e Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:34:58 +0800 Subject: [PATCH 36/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index b84515c84..033911544 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -48,7 +48,7 @@ JavaScript 允许我们通过下述三种表示方式之一将一个字符以其 最初,JavaScript 是基于 UTF-16 编码的,只允许每个字符占 2 个字节长度。但 2 个字节只允许 65536 种组合,这对于表示 Unicode 里每个可能符的号来说,是不够的。 -因此,需要超过 2 个字节的稀有符号使用一对 2 字节字符编码,称为“代理对”(surrogate pair)。 +因此,需要使用超过 2 个字节长度来表示的稀有符号,我们则使用一对 2 字节长度的字符编码,它被称为“代理对”(surrogate pair)。 这种做也有副作用 —— 这些符号的长度为 `2`: From 59198b7787265f7c6ce10eeb6e4e1cafe3658e11 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:35:15 +0800 Subject: [PATCH 37/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 033911544..f791f4930 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -60,7 +60,7 @@ alert( '𩷶'.length ); // 2, 一个少见的中文字符 这是因为在 JavaScript 被创造出来的时候,代理对这个概念并不存在,因此语言并没有正确处理它们! -虽然上面的每个字符串都只有一个符号显示,但是 `length` 属性显示的长度为 `2`。 +虽然上面的每个字符串都只有一个字符,但其 `length` 属性显示其长度为 `2`。 要想获取这些符号,也是一个棘手的问题:在大多数编程语言里,代理对是被当成两个单独的字符对待的。 From 4b526bf9d9394646f544e888d3fdcdc6bf06b747 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:35:36 +0800 Subject: [PATCH 38/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index f791f4930..ccc5dde5c 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -62,7 +62,7 @@ alert( '𩷶'.length ); // 2, 一个少见的中文字符 虽然上面的每个字符串都只有一个字符,但其 `length` 属性显示其长度为 `2`。 -要想获取这些符号,也是一个棘手的问题:在大多数编程语言里,代理对是被当成两个单独的字符对待的。 +如何获取这些符号,也是一个棘手的问题:因为编程语言的大部分功能都将代理对当作两个字符对待。 举个例子,我们可以在输出中看到两个奇数字符: From 200d1eb4bd9419337a799cde0924477c241ef7d5 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:35:49 +0800 Subject: [PATCH 39/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index ccc5dde5c..6160eb506 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -64,7 +64,7 @@ alert( '𩷶'.length ); // 2, 一个少见的中文字符 如何获取这些符号,也是一个棘手的问题:因为编程语言的大部分功能都将代理对当作两个字符对待。 -举个例子,我们可以在输出中看到两个奇数字符: +举个例子,我们可以在输出中看到两个奇怪的字符: ```js run alert( '𝒳'[0] ); // 显示出了一个奇怪的符号... From dcfd65f22c53fabd3e0c09979a623b25afd12d41 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:35:59 +0800 Subject: [PATCH 40/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 6160eb506..50b7aba90 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -71,7 +71,7 @@ alert( '𝒳'[0] ); // 显示出了一个奇怪的符号... alert( '𝒳'[1] ); // ...代理对的片段 ``` -代理对被分开后,就失去意义了。 所以上面示例中,由 `alert()` 打印出的内容,其实就是没有任何意义的垃圾。 +代理对的片段失去彼此就没有意义。所以上面示例中 `alert()` 打印出的内容其实就是没有任何意义的垃圾信息。 从技术层面上讲,可以通过代码来检测到代理对的存在:如果一个字符的代码在 `0xd800..0xdbff` 这个区间内,那么它就是代理对的前一部分。 下一个字符(第二部分)的代码必须在区间 `0xdc00..0xdfff` 内。 这些区间是标准专门为代理对预留的, From 298fb9a65bf74e157302b265f1783fec4d5ad527 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:36:17 +0800 Subject: [PATCH 41/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 50b7aba90..98fd07553 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -73,7 +73,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 代理对的片段失去彼此就没有意义。所以上面示例中 `alert()` 打印出的内容其实就是没有任何意义的垃圾信息。 -从技术层面上讲,可以通过代码来检测到代理对的存在:如果一个字符的代码在 `0xd800..0xdbff` 这个区间内,那么它就是代理对的前一部分。 下一个字符(第二部分)的代码必须在区间 `0xdc00..0xdfff` 内。 这些区间是标准专门为代理对预留的, +从技术上讲,可以通过代理对的编码来检测代理对:如果一个字符的编码在 `0xd800..0xdbff` 这个范围中,那么它就是代理对的前一个部分。下一个字符(第二部分)的编码必须在 `0xdc00..0xdfff` 范围中。这两个范围中的编码是规范中专为代理对预留的。 所以,方法 [String.fromCodePoint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint) 和 [str.codePointAt](https://developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) 被添加到 JavaScript,以处理代理对。 From ef30f1e6799f905bb3b60e6473820c3ef10e8c2a Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:36:35 +0800 Subject: [PATCH 42/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 98fd07553..3cd45fdcf 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -75,7 +75,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 从技术上讲,可以通过代理对的编码来检测代理对:如果一个字符的编码在 `0xd800..0xdbff` 这个范围中,那么它就是代理对的前一个部分。下一个字符(第二部分)的编码必须在 `0xdc00..0xdfff` 范围中。这两个范围中的编码是规范中专为代理对预留的。 -所以,方法 [String.fromCodePoint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint) 和 [str.codePointAt](https://developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) 被添加到 JavaScript,以处理代理对。 +基于此,JavaScript 新增了 [String.fromCodePoint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint) 和 [str.codePointAt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) 这两个方法来处理代理对。 它们本质上与 [String.fromCharCode](mdn:js/String/fromCharCode) 和 [str.charCodeAt](mdn:js/String/charCodeAt) 相同,但它们可以正确地处理代理对。 From 6625bd898df5d5648624b7378bcc18319c5c6ab3 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:36:49 +0800 Subject: [PATCH 43/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 3cd45fdcf..c6c5fad46 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -82,7 +82,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 在这里可以看出它们的区别: ```js run -// charCodeAt 不会考虑代理对, 所以返回了 𝒳 前半部分的代码: +// charCodeAt 不会考虑代理对,所以返回了 𝒳 前半部分的编码: alert( '𝒳'.charCodeAt(0).toString(16) ); // d835 From 1df2f82e267ebd7e4afe1685bfa92ed20d08919d Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:37:15 +0800 Subject: [PATCH 44/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index c6c5fad46..5d791816b 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -86,7 +86,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 alert( '𝒳'.charCodeAt(0).toString(16) ); // d835 -// codePointAt 会正确处理代理对 +// codePointAt 可以正确处理代理对 alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, 读取到了完整的代理对 ``` From adf0952987f358cdd036d0433b071f3682458c97 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:37:32 +0800 Subject: [PATCH 45/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 5d791816b..15a42f7c9 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -90,7 +90,7 @@ alert( '𝒳'.charCodeAt(0).toString(16) ); // d835 alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, 读取到了完整的代理对 ``` -也就是说,如果我们从字符串的位置 1 开始获取 `charCode` 与 `codePoint` (这么做是不对的),那么这两个方法调用后,都只返回了该代理对的后半部分: +也就是说,如果我们从 `𝒳` 的位置 1 开始获取对应的编码(这么做是不对的),那么这两个方法都只会返回此代理对的后半部分: ```js run alert( '𝒳'.charCodeAt(1).toString(16) ); // dcb3 From 1dae51cb6cfd04e6458e59c816de4ef580c7d542 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 15:43:12 +0800 Subject: [PATCH 46/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 15a42f7c9..0e09c9fc7 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -87,7 +87,7 @@ alert( '𝒳'[1] ); // ...代理对的片段 alert( '𝒳'.charCodeAt(0).toString(16) ); // d835 // codePointAt 可以正确处理代理对 -alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3, 读取到了完整的代理对 +alert( '𝒳'.codePointAt(0).toString(16) ); // 1d4b3,读取到了完整的代理对 ``` 也就是说,如果我们从 `𝒳` 的位置 1 开始获取对应的编码(这么做是不对的),那么这两个方法都只会返回此代理对的后半部分: From 8ce3b3d81440f4b88b114f6037f671385ec5ed6f Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:02:05 +0800 Subject: [PATCH 47/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 0e09c9fc7..14c360fe2 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -98,7 +98,7 @@ alert( '𝒳'.codePointAt(1).toString(16) ); // dcb3 // 无意义的代理对后半部分 ``` -你将会在 一章找到更多处理代理对的方法。 如今可能会有专门处理代理对的库,但没有足够流行到让我们可以在这里安利的库。 +你稍后可以在 一章中找到更多处理代理对的方式。可能也有专门处理代理对的库,但没有足够流行到可以让我们在这里推荐的库。 ````warn header="注意:在任意点拆分字符串是危险的" 我们不能只在任意位置拆分字符串,例如 从 `str.slice(0, 4)` 取出一个字符串,并期待它是一个有效的字符串,例如: From c2c889fc74c1e1da6d29f42cd27e2f69f431bd52 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:02:18 +0800 Subject: [PATCH 48/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 14c360fe2..4f43ad925 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -100,7 +100,7 @@ alert( '𝒳'.codePointAt(1).toString(16) ); // dcb3 你稍后可以在 一章中找到更多处理代理对的方式。可能也有专门处理代理对的库,但没有足够流行到可以让我们在这里推荐的库。 -````warn header="注意:在任意点拆分字符串是危险的" +````warn header="注意:在任意点拆分字符串是很危险的" 我们不能只在任意位置拆分字符串,例如 从 `str.slice(0, 4)` 取出一个字符串,并期待它是一个有效的字符串,例如: ```js run From ed80077443a1e9b75ff71fc88a4bd232d8f87c45 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:02:35 +0800 Subject: [PATCH 49/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 4f43ad925..a4e09996e 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -148,7 +148,7 @@ let s2 = 'S\u0323\u0307'; // Ṩ, S + 下句点 + 上句点 alert( `s1: ${s1}, s2: ${s2}` ); -alert( s1 == s2 ); // 这两个字符在我们眼里看起来是相同的,却打印出了 false(?!) +alert( s1 == s2 ); // 尽管这两个字符在我们看来是相通的,但结果却是 false ``` “Unicode 规范化”算法可以解决这个问题,该算法将每个字符串转换为单一的“规范的”形式。 From ad573838eec02d1f761266e9abc69465ea683a55 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:03:00 +0800 Subject: [PATCH 50/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index a4e09996e..f57a60cf3 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -144,7 +144,7 @@ alert( 'S\u0307\u0323' ); // Ṩ ```js run let s1 = 'S\u0307\u0323'; // Ṩ, S + 上句点 + 下句点 -let s2 = 'S\u0323\u0307'; // Ṩ, S + 下句点 + 上句点 +let s2 = 'S\u0323\u0307'; // Ṩ, S + 下方点符号 + 上方点符号 alert( `s1: ${s1}, s2: ${s2}` ); From 5e8132f4b0454849e1db723ceb13b19874816513 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:03:39 +0800 Subject: [PATCH 51/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index f57a60cf3..ceddb3daf 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -143,7 +143,7 @@ alert( 'S\u0307\u0323' ); // Ṩ 举个例子: ```js run -let s1 = 'S\u0307\u0323'; // Ṩ, S + 上句点 + 下句点 +let s1 = 'S\u0307\u0323'; // Ṩ, S + 上方点符号 + 下方点符号 let s2 = 'S\u0323\u0307'; // Ṩ, S + 下方点符号 + 上方点符号 alert( `s1: ${s1}, s2: ${s2}` ); From 4a4aa848de485714a3b31c8a06ad0909e88ecbcf Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:03:55 +0800 Subject: [PATCH 52/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index ceddb3daf..b28e345bb 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -109,7 +109,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] 在这里,我们看到一个没有意义的垃圾字符被打印了出来(微笑表情代理对的前半部分)。 -如果你打算可靠地使用代理对,请注意这一点。 这可能并不是什么大问题,但至少你应该得明白什么会发生。 +如果你期望可靠地使用代理对,请注意这一点。这可能并不是什么大问题,但至少你应该知道发生了什么。 ```` ## 变音符号与规范化 From 01ffa173932ddcbe83e1a0c0ac269efe9977cb9c Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:04:06 +0800 Subject: [PATCH 53/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index b28e345bb..78d77e657 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -112,7 +112,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] 如果你期望可靠地使用代理对,请注意这一点。这可能并不是什么大问题,但至少你应该知道发生了什么。 ```` -## 变音符号与规范化 +## 变音符号和规范化 许多语言会有由基本字符以及上标记/下标记组成的符号。 From d178d89341f92bf5a6af2fa8b8317d176f5123f5 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:04:17 +0800 Subject: [PATCH 54/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 78d77e657..91ab02fca 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -114,7 +114,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] ## 变音符号和规范化 -许多语言会有由基本字符以及上标记/下标记组成的符号。 +很多语言都有由基础字符及其上方/下方的标记所组成的符号。 举个例子,`àáâäãåā` 这些字符是基于字母 `a` 得来的。 From c5d9fcd1f203b8bebf510d218de1f598e40bf342 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:04:27 +0800 Subject: [PATCH 55/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 91ab02fca..1b28ce4c2 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -116,7 +116,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] 很多语言都有由基础字符及其上方/下方的标记所组成的符号。 -举个例子,`àáâäãåā` 这些字符是基于字母 `a` 得来的。 +举个例子,字母 `a` 就是这些字符 `àáâäãåā` 的基础字符。 常见的“复合”字符在 Unicode 表中都有自己的代码。 但不是所有这些字符都有自己的代码,因为可能的组合有太多了。 From 79eac994eef72c1d3307de3dbd389d637076c691 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:04:38 +0800 Subject: [PATCH 56/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 1b28ce4c2..f7d5e7c4e 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -118,7 +118,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] 举个例子,字母 `a` 就是这些字符 `àáâäãåā` 的基础字符。 -常见的“复合”字符在 Unicode 表中都有自己的代码。 但不是所有这些字符都有自己的代码,因为可能的组合有太多了。 +大多数常见的“复合”字符在 Unicode 表中都有自己的编码。但不是所有这些字符都有自己的编码,因为可能的组合形式太多了。 为了支持任意的组合,Unicode 标准允许我们使用多个 Unicode 字符:基本字符后跟一个或多个“装饰”它的“标记”字符。 From 2ceae9da4d9617b317e34293c9e13959f9e0719f Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:04:48 +0800 Subject: [PATCH 57/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index f7d5e7c4e..7833874e1 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -120,7 +120,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] 大多数常见的“复合”字符在 Unicode 表中都有自己的编码。但不是所有这些字符都有自己的编码,因为可能的组合形式太多了。 -为了支持任意的组合,Unicode 标准允许我们使用多个 Unicode 字符:基本字符后跟一个或多个“装饰”它的“标记”字符。 +为了支持任意的组合,Unicode 标准允许我们使用多个 Unicode 字符:基础字符后跟着一个或多个“装饰”它的“标记”字符。 例如,如果我们在 `S` 后跟特殊的“上句点”字符(代码为 `\u0307`),则显示为 Ṡ。 From 53d3b71a0df2da3556f5b6c3c81def7f557f2872 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:04:59 +0800 Subject: [PATCH 58/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 7833874e1..cda140f92 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -122,7 +122,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] 为了支持任意的组合,Unicode 标准允许我们使用多个 Unicode 字符:基础字符后跟着一个或多个“装饰”它的“标记”字符。 -例如,如果我们在 `S` 后跟特殊的“上句点”字符(代码为 `\u0307`),则显示为 Ṡ。 +例如,如果我们在 `S` 后附加上特殊的“上方的点”字符(编码为 `\u0307`),则显示为 Ṡ。 ```js run alert( 'S\u0307' ); // Ṡ From 433457bbacb78098e2ffe971a351f6965ba24a77 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:05:11 +0800 Subject: [PATCH 59/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index cda140f92..f7a0dfbf8 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -101,7 +101,7 @@ alert( '𝒳'.codePointAt(1).toString(16) ); // dcb3 你稍后可以在 一章中找到更多处理代理对的方式。可能也有专门处理代理对的库,但没有足够流行到可以让我们在这里推荐的库。 ````warn header="注意:在任意点拆分字符串是很危险的" -我们不能只在任意位置拆分字符串,例如 从 `str.slice(0, 4)` 取出一个字符串,并期待它是一个有效的字符串,例如: +我们不能随意在任意位置对字符串进行拆分,例如通过 `str.slice(0, 4)` 获取一个字符串,并期待它是一个有效的字符串: ```js run alert( 'hi 😂'.slice(0, 4) ); // hi [?] From 4f7e427849232b2dff795b82c37e085579fe876d Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:05:22 +0800 Subject: [PATCH 60/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index f7a0dfbf8..995446fdb 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -107,7 +107,7 @@ alert( '𝒳'.codePointAt(1).toString(16) ); // dcb3 alert( 'hi 😂'.slice(0, 4) ); // hi [?] ``` -在这里,我们看到一个没有意义的垃圾字符被打印了出来(微笑表情代理对的前半部分)。 +在这里,我们看到一个没有意义的垃圾字符被打印了出来(笑哭表情代理对的前半部分)。 如果你期望可靠地使用代理对,请注意这一点。这可能并不是什么大问题,但至少你应该知道发生了什么。 ```` From dc56eea4a1adc799af8227c74bb3e1cd0376e171 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:05:31 +0800 Subject: [PATCH 61/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 995446fdb..f53df6f84 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -128,7 +128,7 @@ alert( 'hi 😂'.slice(0, 4) ); // hi [?] alert( 'S\u0307' ); // Ṡ ``` -我们只需添加必要的标记字符,便可在字母上方(或下方)添加额外的标记。 +如果我们需要在字母上方(或下方)添加一个额外的标记 —— 很简单,只需添加必要的标记字符即可。 例如,如果我们附加一个字符“下句点”(代码 `\u0323`),那么我们将得到“有上下句点的 S”:`Ṩ`。 From 2d23a06f94b43fd5522cd44df77baa4bfef5e66b Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:05:39 +0800 Subject: [PATCH 62/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index f53df6f84..56b0fe347 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -130,7 +130,7 @@ alert( 'S\u0307' ); // Ṡ 如果我们需要在字母上方(或下方)添加一个额外的标记 —— 很简单,只需添加必要的标记字符即可。 -例如,如果我们附加一个字符“下句点”(代码 `\u0323`),那么我们将得到“有上下句点的 S”:`Ṩ`。 +例如,如果我们继续在后面附加一个“下方的点”符号(编码 `\u0323`),那么我们将得到一个“上下都有一个点符号的 S”:`Ṩ`。 如下代码所示: From bb287da56fcbfa737b99a427cb5eed737b1b0538 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:05:47 +0800 Subject: [PATCH 63/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 56b0fe347..4760bc666 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -132,7 +132,7 @@ alert( 'S\u0307' ); // Ṡ 例如,如果我们继续在后面附加一个“下方的点”符号(编码 `\u0323`),那么我们将得到一个“上下都有一个点符号的 S”:`Ṩ`。 -如下代码所示: +就像这样: ```js run alert( 'S\u0307\u0323' ); // Ṩ From d7208bce529963a619b5a60878a25dfc6ab863d4 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 26 Dec 2022 16:05:56 +0800 Subject: [PATCH 64/64] Update 1-js/99-js-misc/06-unicode/article.md --- 1-js/99-js-misc/06-unicode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-unicode/article.md b/1-js/99-js-misc/06-unicode/article.md index 4760bc666..90b5e9452 100644 --- a/1-js/99-js-misc/06-unicode/article.md +++ b/1-js/99-js-misc/06-unicode/article.md @@ -138,7 +138,7 @@ alert( 'S\u0307' ); // Ṡ alert( 'S\u0307\u0323' ); // Ṩ ``` -这非常灵活,但也带来了一个有趣的问题:两个字符在我们眼里看起来虽然相同,却用着不同的 Unicode 组合表示。 +这提供了极大的灵活性,但也带来了一个有趣的问题:两个字符可能在视觉上看起来相同,但却使用的是不同的 Unicode 组合。 举个例子: