/
965.txt
179 lines (131 loc) · 8.83 KB
/
965.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
[19] [[Unicode符号位置]]を [DFN[[CODE[\u[VAR[HHHH]]]]]]
のように[[エスケープ]]する方法が色々な場面で使われます。
* BMP 符号位置の符号化
[20] [CODE(char)[U+0000]]-[CODE(char)[U+FFFF]] の[[符号位置]]は、
[CODE[\u]] の後に4桁の[[ASCII十六進数字]]で[[符号位置]]を表すことによって表現できます。
[22] [[十六進数字]]として[[大文字]]と[[小文字]]のどちらを用いるか (両方認められるか)
は、使われる文脈によります。
[21] 何を[[エスケープ]]形で表し、何を[[エスケープ]]しないで表すかは、
使われる文脈によります。
* 非 BMP 符号位置の符号化
[23] [CODE(char)[U+10000]] [[以上]]の[[符号位置]]の表現方法は、
いくつかの流儀があります。
[24] 古くから使われている方法では、 [CODE[\U]] の後に8桁の[[十六進数字]]で[[符号位置]]を指定します。
この方法は [[UCS]] の31ビットすべての[[符号位置]]を表現できます。
([[BMP][UCS BMP]] をこの方法でも表現できるかどうかは、文脈によります。)
[25] 場合によっては、 [CODE[\U]] の後に6桁の[[十六進数字]]で[[符号位置]]を指定します。
この方法は [[Unicode]] の21ビットすべての[[符号位置]]を表現できます。
([[BMP][UCS BMP]] をこの方法でも表現できるかどうかは、文脈によります。)
[26] この2つの方法は、混在させることができません。
[27] [[UTF-16]] を使う環境では、[[サロゲートペア]]に相当する2つの[[符号位置]]の
[CODE[\u[VAR[HHHH]]]] 形で非 [[BMP][UCS BMP]] [[符号位置]]を表現する場合があります。
* エラー処理
[28] エラー処理の方法は、文脈によります。困ったことに、明確に規定していない場合もあります。
[29] 少なくても次のようなエラー状況を想定する必要があります。
[FIG(list)[
- [30] [CODE[\u[VAR[HHHH]]]] など適切な形式にならずに途切れている [CODE[\]]
などが出現した場合の扱い
- [31] [[値域]]外の[[符号位置]]の扱い ([[Unicode]] の範囲外の [CODE[\U12345678]]
のようなものなど)
- [32] [[サロゲート]]の[[符号位置]]の扱い ([[サロゲート]]を認めない場合、
[[サロゲート]]自体と[[エスケープ]]された[[サロゲート]]の組で現れた場合、
単独の[[サロゲート]]が現れた場合)
- [33] [[非文字]]の扱い
]FIG]
* 十六進記法 (Unicode 正規表現)
[37]
[[Unicode正規表現]]においては、
[DFN[[RUBYB[[RUBY[十][じゅう]][RUBY[六][ろく]][RUBY[進][しん]][RUBY[記][き]][RUBY[法][ほう]]][Hex Notation]]]]の実装が要求されています。
[SRC[>>36]]
[38]
[[十六進記法]]は、
[[16進数]]表現によって任意の[[Unicode符号点]]
[ [CODE[U+0000]], [CODE[U+10FFFF]] ]
を指定できなければなりません。
[SRC[>>36 RL1.1]]
;; [48]
[[サロゲート符号点]]や[[非文字]]も含まれています。
[39]
特定の構文の実装までは要求されておらず、既存の[[正規表現]]構文の自然な拡張が想定されているようです。
しかしながら、
[[符号点]]を[[16進数]]で表したものでなくてはならず、
[[UTF-8]] [[バイト列]]や [[UTF-16符号単位]]の[[16進数]]表現ではこの要件を満たせません
[SRC[>>36]]。
[EG[
[40]
[CODE[U+1D11E]]
を
[CODE[\U0001D11E]],
[CODE[\x{1D11E}]],
[CODE[\u{1D11E}]]
のように表せます。
[SRC[>>36]]
]EG]
[41]
記法例として、次のような構文が定められています。 [SRC[>>36]]
- [42] [CODE[\u]] の後に4つの[[ASCII十六進数字]]
-- [45] [[ASCII十六進数字]]の[[Unicode符号点]]を表します。
- [43] [CODE[\u{]] の後に[VAR[符号点]]の並びの後に [CODE[}]]
-- [44] [VAR[符号点]]は1から5個の[[ASCII十六進数字]]か [CODE[10]] の後に4個の
[[ASCII十六進数字]]
-- [46] [VAR[符号点]]の並びは1個[[以上]]の[VAR[符号点]]を
[CODE(charname)@en[SP]] で区切ったもの
-- [47] [VAR[符号点]]の[[Unicode符号点]]を順に並べたものを表します。
[REFS[
- [36]
[CITE@en-us[UTS #18: Unicode Regular Expressions]], [TIME[2022-02-08T14:02:12.000Z]], [TIME[2022-11-13T03:56:15.819Z]] <https://unicode.org/reports/tr18/#Hex_notation>
]REFS]
* [CODE[\u[VAR[HHHH]]]] (Java)
[1] [[Java]] の \u 符号化 (UnicodeEscape)
<http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100850>
<http://java.sun.com/docs/books/jls/first_edition/html/3.doc.html#100850>
<http://www.y-adagio.com/public/standards/tr_javalang2/lexical.doc.html>
<http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm>
[2] >>1 を [[ABNF]] に翻訳すると、
-[3] UnicodeEscape = "\" 1*('u') 4HEXDIGIT
[4] [[Mozilla]] でも使われていて、 [CODE[x-u-escaped]] と呼ばれている。
[5] U+10000 〜 をどう表現するのかは不明。
- [6] [[JavaSDK]] に [CODE[native2ascii]] というのが入ってます。これを使って変換します。
- [7] >>3 にあるように [CODE[\uu4E00]] みたいな書き方が可能 (意味は >>1 参照。) なの (は Java 以外の実装、例えば Mozilla とかが対応しているのか) と、 >>5 の疑問があるのですが、なんせ "\u" なんてどこの検索円陣にも掛からないし、さぱーりわからない。
- [8] Java や Mozilla とは関係なしに、各種言語・表記法などで、従来の [CODE[[[\x]]]] などのオクテット表現方法の延長として [CODE[\u[VAR[HHHH]]]] が使われることがよくあります。
- [9] >>8 のような場合で、 [CODE(char)[U+FFFF]] より大きいのを表現する方法は、 [CODE[\U[VAR[HHHHHH]]]] を使う方法と [CODE[\U[VAR[HHHHHHHH]]]] を使う方法があります。 (後者がお勧め。) ほかに[[サロゲート]]を使ってがんばる処理系もあるかもしれませんが、萎え萎え。
[10] >>5-9 Java では [CODE[\U[VAR[HHHHHH]]]] とするようです。
''Supplementary Characters in the Java Platform'' <http://java.sun.com/developer/technicalArticles/Intl/Supplementary/>
* [CODE[\uHHHH]] (JavaScript)
[11] [[JavaScript]] の[[正規表現]]で \u の後に[[十六進数]]が4桁続かない場合、
[[ES3]] によると構文エラーのはずですが、どのブラウザでも、 \
がなかった場合と同じように処理されます。
;;
<http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0Adocument.write%20(%22u1%22.match(%2F%5E%5Cu1%24%2F)%3F1%3A0)%3B%0A%3C%2Fscript%3E>
* [CODE[\u'[VAR[HHHH]]']] (RFC 5137)
[12] [[RFC 5137]] ([[BCP 137]]) は、
[[Unicode]] [[文字]]を [[escape]] するための方法で勧められるものを2つ挙げています。
そのうちの1つが ¥u'HHHH' のような書式です。
EmbeddedUnicodeChar = %x5C.75.27 4*6HEXDIG %x27
; starting with lowercase "\u" and "'" and ending with "'".
; Note that the encodings are considered to be abstractions
; for the relevant characters, not designations of specific
; octets.
HEXDIG = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
"A" / "B" / "C" / "D" / "E" / "F"
[[RFC 5234のABNF]] を用いているので、[[十六進数]]の[[大文字]]・[[小文字]]は区別しません。
(「\u」の部分は[[小文字]]でなければなりません。)
;; [13] [[RFC 5137]] はこの他 [[XML]] の[[十六進数文字参照]]も勧めています。
[[C]] 式の「\uHHHH」/「\UHHHHHHHH」表記、 [[Perl]] 風の「¥x{H}」表記、
[[Java]] 式の「\uHHHH」+ [[代理組]]表記は「通常は勧められない」としています。
([[C]] 式が勧められないのは、終わりを表す[[区切子]]がないため。)
[14] [CITE@en[RFC 5137 - ASCII Escaping of Unicode Characters]]
([TIME[2015-07-26 17:06:08 +09:00]] 版)
<https://tools.ietf.org/html/rfc5137#section-5.1>
[15] [CITE@en[draft-klensin-encoded-word-type-u-00 - The "U" Encoding for Encoded-Words in Email]]
([TIME[2016-01-11 02:26:53 +09:00]] 版)
<https://tools.ietf.org/html/draft-klensin-encoded-word-type-u-00>
[16] この方法が [[IETF]] 以外で使われるのは見たことがありません。
[[IETF]] は世間一般で広く普及した形式を奇妙にアレンジするのが好きなようです。
* 関連
[17] [CODE[U+]] や [CODE[%u]] も参照。
[34] [CODE[\x]] も参照。
* メモ
[18] [CITE[Unicode の文字列をソースコードに埋め込む方法 - いやなブログ]] ([CODE[2007-09-09 19:34:15 +09:00]] 版) <http://0xcc.net/blog/archives/000183.html>
[35]
[CITE@en[rfc3862]], [TIME[2021-06-11T05:05:37.000Z]] <https://datatracker.ietf.org/doc/html/rfc3862#section-2.3>