Skip to content

Commit 05133c9

Browse files
committed
feat: update translation
1 parent 577804f commit 05133c9

File tree

1 file changed

+74
-80
lines changed

1 file changed

+74
-80
lines changed
Lines changed: 74 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,117 +1,111 @@
1-
# Unicode:修饰符 “u” 和 class \p{...}
1+
# Unicode:修饰符 "u" 和 class \p{...}
22

3-
JavaScript 使用 [Unicode 编码](https://en.wikipedia.org/wiki/Unicode) (Unicode encoding)对字符串进行编码。大多数字符使用 2 个字节编码,但这种方式只能编码最多 65536 个字符。
3+
JavaScript 对字符串使用 [Unicode 编码](https://en.wikipedia.org/wiki/Unicode)。大多数字符使用 2 个字节编码,但这种方式只能编码最多 65536 个字符。
44

5-
这个范围不足以对所有可能的字符进行编码,这就是为什么一些罕见的字符使用 4 个字节进行编码,比如 `𝒳` (数学符号 X)或者 `😄` (笑脸),一些象形文字等等。
5+
这个范围不足以对所有可能的字符进行编码,这就是为什么使用 4 个字节对一些罕见的字符进行编码,比如 `𝒳`(数学符号 X) `😄`(笑脸),一些象形文字等等。
66

7-
以下是一些字符对应的 unicode 编码
7+
下面是一些字符对应的 Unicode 值
88

9-
| 字符 | Unicode | unicode 中的字节数 |
9+
| 字符 | Unicode | Unicode 中的字节数 |
1010
| ------------ | --------- | ---------------------- |
1111
| a | `0x0061` | 2 |
1212
|| `0x2248` | 2 |
1313
| 𝒳 | `0x1d4b3` | 4 |
1414
| 𝒴 | `0x1d4b4` | 4 |
1515
| 😄 | `0x1f604` | 4 |
1616

17-
所以像 `a``` 这样的字符占用 2 个字节,而 `𝒳``𝒴``😄` 的对应编码则更长,它们具有 4 个字节的长度
17+
所以像 `a``` 这样的字符占用 2 个字节,而 `𝒳``𝒴``😄` 的对应编码则更长,占用 4 个字节
1818

19-
很久以前,当 JavaScript 被发明出来的时候,Unicode 的编码要更加简单:当时并没有 4 个字节长的字符。所以,一部分语言特性在现在仍旧无法对 unicode 进行正确的处理
19+
很久以前,当 JavaScript 被发明出来的时候,Unicode 编码要更加简单:当时没有 4 个字节的字符。所以,有些语言功能现在仍无法正确处理它们
2020

21-
比如 `length` 认为这里的输入有 2 个字符:
21+
比如 `length` 认为这里有 2 个字符:
2222

2323
```js run
2424
alert('😄'.length); // 2
2525
alert('𝒳'.length); // 2
2626
```
2727

28-
...但我们可以清楚地认识到输入的字符只有一个,对吧?关键在于 `length` 把 4 个字节当成了 2 个 2 字节长的字符。这是不对的,因为它们必须被当作一个整体来考虑(即所谓的“代理伪字符”(surrogate pair),你可以在这里进一步阅读有关的的信息 <info:string>)。
28+
……但我们可以清楚地认识到这里只有一个字符,对吧?关键在于 `length` 把 4 个字节当成了 2 个 2 字节长的字符。这是不对的,因为它们必须被当作一个整体来考虑(即所谓的“代理对(surrogate pair)”,你可以在 <info:string> 中阅读关于代理对的更多信息)。
2929

30-
默认情况下,正则表达式同样把一个 4 个字节的“长字符”当成一对 2 个字节长的字符。正如在字符串中遇到的情况,这将导致一些奇怪的结果。我们将很快在后面的文章中遇到 <info:regexp-character-sets-and-ranges>
30+
默认情况下,正则表达式也会把一个 4 个字节的“长字符”当成一对 2 个字节长的字符。正如在字符串中遇到的情况,这将导致一些奇怪的结果。我们很快会在后面的章节 <info:regexp-character-sets-and-ranges> 中遇到
3131

32-
与字符串有所不同的是,正则表达式有一个修饰符 `pattern:u` 被用以解决此类问题。当一个正则表达式使用这个修饰符后,4 个字节长的字符将被正确地处理。同时也能够用上 Unicode 属性(Unicode property)来进行查找了。我们接下来就来了解这方面的内容
32+
与字符串有所不同的是,正则表达式有一个修饰符 `pattern:u` 被用以解决此类问题。当一个正则表达式带有这个修饰符后,4 个字节长的字符将被正确地处理。同时也能够使用 Unicode 属性进行查找了,我们接下来就一起学习它吧
3333

34-
## Unicode 属性(Unicode properties)\p{...}
34+
## Unicode 属性 \p{...}
3535

36-
```warn header="在 Firefox 和 Edge 中缺乏支持"
37-
尽管 unicode property 从 2018 年以来便作为标准的一部分, 但 unicode 属性在 Firefox ([bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1361876)) 和 Edge ([bug](https://github.com/Microsoft/ChakraCore/issues/2969)) 中并没有相应的支持。
36+
Unicode 中的每个字符都有很多属性。它们描述了字符所属的“类别”,包含了关于字符的各种信息。
3837

39-
目前 [XRegExp](http://xregexp.com) 这个库提供“扩展”的正则表达式,其中包括对 unicode property 的跨平台支持。
40-
```
41-
42-
Unicode 中的每一个字符都具有很多的属性。它们描述了一个字符属于哪个“类别”,包含了各种关于字符的信息。
43-
44-
例如,如果一个字符具有 `Letter` 属性,这意味着这个字符归属于(任意语言的)一个字母表。而 `Number` 属性则表示这是一个数字:也许是阿拉伯语,亦或者是中文,等等。
38+
例如,如果一个字符具有 `Letter` 属性,这意味着这个字符归属于(任意语言的)字母表。而 `Number` 属性则表示这是一个数字:也许是阿拉伯数字,亦或是中文数字,等等。
4539

46-
我们可以查找具有某种属性的字符,写作 `pattern:\p{…}`为了顺利使用 `pattern:\p{…}`,一个正则表达式必须使用修饰符 `pattern:u`
40+
我们可以查找具有某种属性的字符,写作 `pattern:\p{…}`为了使用 `pattern:\p{…}`,一个正则表达式必须使用修饰符 `pattern:u`
4741

48-
举个例子,`\p{Letter}` 表示任何语言中的一个字母。我们也可以使用 `\p{L}`,因为 `L``Letter` 的一个别名(alias)。对于每种属性而言,几乎都存在对应的缩写别名。
42+
举个例子,`\p{Letter}` 表示任何语言中的一个字母。我们也可以使用 `\p{L}`,因为 `L``Letter` 的一个别名。对于每种属性而言,几乎都存在对应的缩写别名。
4943

50-
在下面的例子中 3 种字母将会被查找出:英语、格鲁吉亚语和韩语。
44+
在下面的例子中会找出来 3 种字母:英语、格鲁吉亚语和韩语。
5145

5246
```js run
5347
let str = "A ბ ㄱ";
5448

5549
alert( str.match(/\p{L}/gu) ); // A,ბ,ㄱ
56-
alert( str.match(/\p{L}/g) ); // null(没有匹配的文本,因为没有修饰符“u”
50+
alert( str.match(/\p{L}/g) ); // null(没有匹配项,因为没有修饰符 "u"
5751
```
5852

5953
以下是主要的字符类别和它们对应的子类别:
6054

61-
- 字母(Letter) `L`:
62-
- 小写(lowercase) `Ll`
63-
- 修饰(modifier) `Lm`,
64-
- 首字母大写(titlecase) `Lt`,
65-
- 大写(uppercase) `Lu`,
66-
- 其它(other) `Lo`
67-
- 数字(Number) `N`:
68-
- 十进制数字(decimal digit) `Nd`,
69-
- 字母数字(letter number) `Nl`,
70-
- 其它(other) `No`
71-
- 标点符号(Punctuation) `P`:
72-
- 链接符(connector) `Pc`,
73-
- 横杠(dash) `Pd`,
74-
- 起始引用号(initial quote) `Pi`,
75-
- 结束引用号(final quote) `Pf`,
76-
- 开(open) `Ps`,
77-
- 闭(close) `Pe`,
78-
- 其它(other) `Po`
79-
- 标记(Mark) `M` (accents etc):
80-
- 间隔合并(spacing combining) `Mc`,
81-
- 封闭(enclosing) `Me`,
82-
- 非间隔(non-spacing) `Mn`
83-
- 符号(Symbol) `S`:
84-
- 货币(currency) `Sc`,
85-
- 修饰(modifier) `Sk`,
86-
- 数学(math) `Sm`,
87-
- 其它(other) `So`
88-
- 分隔符(Separator) `Z`:
89-
- 行(line) `Zl`,
90-
- 段落(paragraph) `Zp`,
91-
- 空格(space) `Zs`
92-
- 其它(Other) `C`:
93-
- 控制符(control) `Cc`,
94-
- 格式(format) `Cf`,
95-
- 未分配(not assigned) `Cn`,
96-
- 私有(private use) `Co`,
97-
- 代理伪字符(surrogate) `Cs`
55+
- 字母(Letter)`L`
56+
- 小写(lowercase)`Ll`
57+
- 修饰(modifier)`Lm`
58+
- 首字母大写(titlecase)`Lt`
59+
- 大写(uppercase)`Lu`
60+
- 其它(other)`Lo`
61+
- 数字(Number)`N`
62+
- 十进制数字(decimal digit)`Nd`
63+
- 字母数字(letter number)`Nl`
64+
- 其它(other)`No`
65+
- 标点符号(Punctuation)`P`
66+
- 连接符(connector)`Pc`
67+
- 横杠(dash)`Pd`
68+
- 起始引号(initial quote)`Pi`
69+
- 结束引号(final quote)`Pf`
70+
- 开(open)`Ps`
71+
- 闭(close)`Pe`
72+
- 其它(other)`Po`
73+
- 标记(Mark)`M`accents etc):
74+
- 间隔合并(spacing combining)`Mc`
75+
- 封闭(enclosing)`Me`
76+
- 非间隔(non-spacing)`Mn`
77+
- 符号(Symbol)`S`
78+
- 货币(currency)`Sc`
79+
- 修饰(modifier)`Sk`
80+
- 数学(math)`Sm`
81+
- 其它(other)`So`
82+
- 分隔符(Separator)`Z`
83+
- 行(line)`Zl`
84+
- 段落(paragraph)`Zp`
85+
- 空格(space)`Zs`
86+
- 其它(Other)`C`
87+
- 控制符(control)`Cc`
88+
- 格式(format)`Cf`
89+
- 未分配(not assigned)`Cn`
90+
- 私有(private use)`Co`
91+
- 代理伪字符(surrogate)`Cs`
9892

9993

10094
因此,比如说我们需要小写的字母,就可以写成 `pattern:\p{Ll}`,标点符号写作 `pattern:\p{P}` 等等。
10195

10296
也有其它派生的类别,例如:
103-
- `Alphabetic` (`Alpha`), 包含了字母 `L`, 加上字母数字 `Nl` (例如 Ⅻ - 罗马数字 12),加上一些其它符号 `Other_Alphabetic` (`OAlpha`)
97+
- `Alphabetic``Alpha`),包含了字母 `L`加上字母数字 `Nl`(例如 Ⅻ —— 罗马数字 12),加上一些其它符号 `Other_Alphabetic``OAlpha`
10498
- `Hex_Digit` 包括 16 进制数字 `0-9``a-f`
105-
- ...等等
99+
- ……等等。
106100

107-
Unicode 支持相当数量的属性,列出整个清单需要占用大量的空间,因此在这里列出相关的链接:
101+
Unicode 支持很多不同的属性,列出整个清单需要占用大量的篇幅,因此在这里列出相关的链接:
108102

109-
- 列出一个字符的所有属性 <https://unicode.org/cldr/utility/character.jsp>.
110-
- 按照属性列出所有的字符 <https://unicode.org/cldr/utility/list-unicodeset.jsp>.
103+
- 列出一个字符的所有属性<https://unicode.org/cldr/utility/character.jsp>.
104+
- 按照属性列出所有的字符<https://unicode.org/cldr/utility/list-unicodeset.jsp>.
111105
- 属性的对应缩写形式:<https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt>.
112106
- 以文本格式整理的所有 Unicode 字符,包含了所有的属性:<https://www.unicode.org/Public/UCD/latest/ucd/>.
113107

114-
### 实例:16 进制数字
108+
### 举例:16 进制数字
115109

116110
举个例子,让我们来查找 16 进制数字,写作 `xFF` 其中 `F` 是一个 16 进制的数字(0..9 或者 A..F)。
117111

@@ -123,45 +117,45 @@ let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
123117
alert("number: xAF".match(regexp)); // xAF
124118
```
125119

126-
### 实例:中文字符
120+
### 举例:中文字符
127121

128-
让我们再来考虑中文字符
122+
让我们再来查找中文字符
129123

130-
有一个 unicode 属性 `Script` (一个书写系统),这个属性可以有一个值`Cyrillic``Greek``Arabic``Han` (中文)等等,[这里是一个完整的列表](https://en.wikipedia.org/wiki/Script_(Unicode))
124+
有一个 Unicode 属性 `Script`(一个书写系统),这个属性可能有一个值`Cyrillic``Greek``Arabic``Han`(中文)等等,[这里是一个完整的列表](https://en.wikipedia.org/wiki/Script_(Unicode))
131125

132-
为了实现查找一个给定的书写系统中的字符,我们需要使用 `pattern:Script=<value>`例如对于西里尔字符`pattern:\p{sc=Cyrillic}`, 中文字符`pattern:\p{sc=Han}`,等等。
126+
要在给定的书写系统中查找字符,我们需要使用 `pattern:Script=<value>`例如对于西里尔字母`pattern:\p{sc=Cyrillic}`,中文象形文字`pattern:\p{sc=Han}`,等等。
133127

134128
```js run
135-
let regexp = /\p{sc=Han}/gu; // returns Chinese hieroglyphs
129+
let regexp = /\p{sc=Han}/gu; // 返回中文象形文字
136130

137131
let str = `Hello Привет 你好 123_456`;
138132

139133
alert( str.match(regexp) ); // 你,好
140134
```
141135

142-
### 实例:货币
136+
### 举例:货币
143137

144-
表示货币的字符,例如 `$````¥`,具有 unicode 属性 `pattern:\p{Currency_Symbol}`,缩写为 `pattern:\p{Sc}`
138+
表示货币的字符,例如 `$````¥`,具有 Unicode 属性 `pattern:\p{Currency_Symbol}`,缩写为 `pattern:\p{Sc}`
145139

146-
让我们使用这一属性来查找符合“货币,接着是一个数字”的价格文本
140+
让我们用它来查找格式为“货币,接着是一个数字”的价格
147141

148142
```js run
149143
let regexp = /\p{Sc}\d/gu;
150144

151-
let str = `Prices: $2, €1, ¥9`;
145+
let str = `Prices: $2, €1, ¥9`;
152146

153147
alert( str.match(regexp) ); // $2,€1,¥9
154148
```
155149

156-
之后,在文章 <info:regexp-quantifiers> 中我们将会了解如何查找包含很多位的数字
150+
稍后,在文章 <info:regexp-quantifiers> 中我们将学习如何查找包含很多位的数字
157151

158152
## 总结
159153

160-
修饰符 `pattern:u` 在正则表达式中提供对 Unicode 的支持。
154+
修饰符 `pattern:u` 表示启用正则表达式中对 Unicode 的支持。
161155

162156
这意味着两件事:
163157

164-
1. 4 个字节长的字符被以正确的方式处理:被看成单个的字符,而不是 2 个 2 字节长的字符。
165-
2. Unicode 属性可以被用于查找中 `\p{…}`
158+
1. 4 个字节长的字符被以正确的方式处理:被看成单个字符,而不是 2 个 2 字节长的字符。
159+
2. Unicode 属性可以被用于查找:`\p{…}`
166160

167161
有了 unicode 属性我们可以查找给定语言中的词,特殊字符(引用,货币)等等。

0 commit comments

Comments
 (0)