/
895.txt
245 lines (164 loc) · 12.2 KB
/
895.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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
[34] [DFN[[[UTF-8]]]] は、世界中で広く用いられており、 [[Linux]] や [[Web]]
では原則として用いられている標準的な[[文字コード]]です。
* 仕様書
[REFS[
- [53] [CITE@en[RFC 7617 - The 'Basic' HTTP Authentication Scheme]] ([TIME[2015-10-01 09:47:40 +09:00]] 版) <https://tools.ietf.org/html/rfc7617#section-2.1>
- [58] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.3>
]REFS]
* Unicode と UTF-8
[44] [[Unicode]] は、色々な[[文字]]に[[符号]]を与えています。
その[[符号]]をどのように表現するかは選択の余地があり、
歴史的に幾つかの方法が用いられました。その中で現在最も広く用いられているのが
[[UTF-8]] です。 [[UTF-8]] は[[文字]]の[[符号]]を一定の規則で求められる1-4個の[[バイト]]の列として表すものです。
[EG[
[45] [[文字]]「[CODE(char)[a]]」 ([CODE(charname)@en[[[LATIN SMALL LETTER A]]]]) は
[[Unicode]] で [CODE(char)[[[U+0061]]]] という[[符号位置]]が割り当てられています。
これは [[UTF-8]] では[[バイト列]] [CODE(char)[0x61]] によって表されます。
]EG]
[EG[
[46] [[文字]]「[CODE(char)[字]]」 ([CODE(charname)@en[[[CJK UNIFIED IDEOGRAPH-5B57]]]]) は
[[Unicode]] で [CODE(char)[[[U+5B57]]]] という[[符号位置]]が割り当てられています。
これは [[UTF-8]] では[[バイト列]] [CODE(char)[0xE5 0xAD 0x97]] によって表されます。
]EG]
* 定義
@@
* 性質
[38] [[ASCII互換符号化]]です。
[39] [CODE(char)[[[0x00]]]]-[CODE(char)[[[0x7F]]]] は常に
[CODE(char)[[[U+0000]]]]-[CODE(char)[[[U+007F]]]] を表します。
[40] [CODE(char)[[[U+0000]]]]-[CODE(char)[[[U+10FFFF]]]] のすべての[[符号位置]]を[[符号化]]できます。
[48] すべての[[符号位置]]に対応する[[バイト列]]が一意に定まります。
[49] [[文字列]]の[[部分一致]]と[[文字列]]に対応する[[バイト列]]の[[部分一致]]の結果が等しくなります。
[50] [[文字列]]の[[符号位置]]による[[整列]]と[[文字列]]に対応する[[バイト列]]の[[整列]]の結果が等しくなります。
[51] 任意の[[バイト列]]が妥当な[[文字列]]を表すとは限りません。
[52] [[BOM]] を使わない限りは、[[文字列]]を表す[[バイト列]]の単純な連結が[[文字列]]の連結となります。
* BOM との関係
[2] ''[CODE(charset)[UTF-8]] の [[BOM]] は必須ではありません''。
詳しくは [[BOM]>>9] を参照して下さい。 BOM
必須説は、そういうことにしたい人達が勝手に流した風説です。
[8] [[BOM]] を使うと [[UTF-8]] の重要な性質の1つである [[ASCII]] 互換性が失われます。
多くの場合 [[BOM]] を使うのは適切ではないと考えられています。
* 非文字との関係
- [3] [[Unicode]] 3.0 以降では S-area の符号位置 (の UTF-8 表現) は禁止されています。他方、 [CODE[U+FFFF]] のような non-character (の UTF-8 表現) は禁止されていません。 non character は情報交換を目的としたものではありませんから情報交換用で紛れ込んでいたなら間違いですが、内部処理に使うことが出来るものですから、 [[UTF]] で禁止したら使う意味が無くなるということらしいです。
* Charset 名
[13] [[IANA]] に登録された [[charset]] 名は [DFN[[CODE(charset)@en[[[utf-8]]]]]] です。
[14] [[HTTP]] では、たまに誤って [[charset]] 名として [CODE(charset)@en[[[utf8]]]]
が用いられることがあります。
** Unicode の版との関係
@@ [15] [CODE(charset)@en[[[unicode-1-1-utf-8]]]] は・・・
* HTML における UTF-8
[42] [[XML文書]]が [CODE(HTML)@en[[[<meta charset>]]]] を含む場合、その値は
[CODE(charset)@en[[[UTF-8]]]] ([[ASCII大文字・小文字不区別]]) でなければなりません。
従って当該[[文書]]の[[文字符号化]]は、 [[UTF-8]] でなければなりません。
;; [CODE(HTML)@en[[[<meta charset>]]]] 参照。
;; [43] [[HTML文書]]や [CODE(HTML)@en[[[<meta charset>]]]] を含まない[[XML文書]]にはこの制約は適用されません。
* HTTP 認証の [CODE(charset)@en[UTF-8]]
[54] [[基本認証]]や[[ダイジェスト認証]]の [CODE(HTTP)@en[[[charset=""]]]] [[引数]]には値
[DFN[[CODE(charset)@en[[[UTF-8]]]]]] を指定できます [SRC[>>53, >>58]]。
[55] これは、[[文字列]]を [[NFC]] で[[正規化]]してから、
[[RFC 3629]] [[UTF-8]] で[[バイト列]]に変換することをいいます [SRC[>>53]]。
[56] [[受信者]]は、[[利用者識別子]]においては、
[[RFC 7613]] [CODE[[[UsernameCasePreserved]]]] プロファイルから
[CODE[[[:]]]] を除くすべての[[文字]]に対応しなければ[['''なりません''']] [SRC[>>53]]。
[57] [[受信者]]は、[[合言葉]]においては、
[[RFC 7613]] [CODE[[[OpaqueString]]]] プロファイルからすべての[[文字]]に対応しなければ[['''なりません''']] [SRC[>>53]]。
* 歴史
** ISO/IEC 10646 の定義
[36] [[ISO/IEC 10646]] では[[符号位置]]が [CODE(char)[[[U-7FFFFFFF]]]]
まであり、そのすべてが [[UTF-8]] でも表現できます。[[UTF-8]]
における1[[文字]]は最大6[[バイト]]で表現されます。
;; [37] [CODE(char)[[[U-00110000]]]] 以上の[[符号位置]]には[[文字]]は割り当てられていませんが
([[私用域]]が以前はありましたが削除されました。)、
[[UTF-8]] としては現在も存在しているはずです。
** RFC による定義
- [6] [WEAK[2003-11-10 23:49:29 +00:00]] ''[[名無しさん]]'': ついに IETF Full Standard の [[RFC3629]] (= [[STD63]]) がでました。
[41] [[Net-Unicode]] はそれに[[制御文字]]の用法や[[正規化]]に関する規定を加えた[[プロファイル]]です。
** CESU-8
[7] [[CESU-8]] は [CODE(char)[[[U+10000]]]] 以上の[[符号位置]]を [[UTF-16]]
同様の[[サロゲートペア]]によって表現するものです。
;; [[CESU-8]] を参照。
** Web UTF-8
[19] [[Web Applications 1.0]] は、「[DFN[[RUBYB[バイト列をUTF-8として誤り取り扱い付きで復号]@en[decode a byte string as UTF-8, with error handling]]]]」することについて規定しています。
これは、 [[UTF-8]] [[バイト列]]を[[文字列]]に[[復号]]するにあたって不正な[[バイト列]]を適宜
[CODE(char)[[[U+FFFD]]]] に置き換える方法を定めたものです。
[REFS[
- [18] [[Web Applications 1.0]]
<http://www.whatwg.org/specs/web-apps/current-work/complete.html#decoded-as-utf-8,-with-error-handling>
]REFS]
[17] [CITE@en[Web Applications 1.0 r5530 Tighten up UTF-8 error handling definitions Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=9663]]
( ([TIME[2010-09-29 04:16:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5529&to=5530>
[47] これは後の [[Encoding Standard]] の定義につながりました。現在の [[HTML Standard]]
は [[Encoding Standard]] を参照しています。
* 実装
** Emacs で UTF-8
[11] [[Emacs]] で [[UTF-8]] な[[ファイル]]を開くとなぜか[[漢字]]だけ全部化ける ([[仮名]]とかは化けない)
という時は [[.emacs]] とかにこう書くと直るかもよ:
[PRE(example code)[
(prefer-coding-system 'utf-8-unix)
]PRE]
** Perl の UTF-8
[12] [[Perl]] の [CODE(perl)@en[[[Encode]]]] [[モジュール]]には「[[utf8]]」と「[[utf-8]]」
があります。「[[utf8]]」は [[UTF-8]] っぽい[[符号化方式]]を使った [[Perl]]
の[[内部コード]]、「[[utf-8]]」は [[Unicode]] の [[UTF-8]] です。
詳しくは [[utf8 (Perl)]] の項をご覧ください。
** Java の UTF
[1] [[Java]] が実装している UTF-8 の変種は、 U+0000 を表現するために
0xC0 0x80 を (0x00 の代わりに) 使います。 (0x00 は Java
では文字列の終端を表し、文字列内には入れられません。)
- [4] このような、「長さが最小ではない表現」は、 UTF-8 では禁止されています。[WEAK[もっとも、各規格は当初そのことを忘れていました。設計者は最初からそのことに注意していたらしいですが、気が抜けていたとかなんとか。]]
- [5] 実際には巷の UTF-8 の decoder は最短じゃない表現を「意図どおりに」解読してしまうことがありますが、それは禁止されています。
[9]
[Q[Java [RUBYB[修正] [modified]] UTF-8]] (昔は Java の世界で [Q[UTF-8]] と呼ばれていたもの。) は >>1 に加えて [[CESU-8]] らしいです。
''Supplementary Characters in the Java Platform'' <http://java.sun.com/developer/technicalArticles/Intl/Supplementary/>
[10]
''JNI Types and Data Structures'' <http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/types.html>
** MySQL の UTF8
[25] [[MySQL]] では元々の [CODE[[[utf8]]]] は3バイトまでしか表せませんでした。
のちにこれは [CODE[[[utf8mb3]]]] という別名が付けられ、それとは別に、
4バイトまで表せる [CODE[[[utf8mb4]]]] が追加されています。
* メモ
[16] [CITE[Official Google Blog: Unicode nearing 50% of the web]]
([TIME[2010-01-29 05:36:25 +09:00]] 版)
<http://googleblog.blogspot.com/2010/01/unicode-nearing-50-of-web.html>
[20] [CITE@en[Web Applications 1.0 r5940 typo in the allowed UTF-8 ranges]]
( ([TIME[2011-03-04 11:06:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5939&to=5940>
[21] [CITE@en[Web Applications 1.0 r5942 Fix the UTF-8 decoder error handling to handle a few errors I'd missed, including in particular surrogate halves. This may be a mistake; if I'm forgetting something please let me know so I can fix it. (e.g. did we decide not to catch surrogates or something?)]]
( ([TIME[2011-03-04 11:56:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5941&to=5942>
[22] [CITE@en[RFC 6120 - Extensible Messaging and Presence Protocol (XMPP): Core]]
( ([TIME[2011-03-31 08:23:45 +09:00]] 版))
<http://tools.ietf.org/html/rfc6120#section-11.6>
[23] [CITE[「私のために争わないで」文字コードのUTF8さん、自殺 : bogusnews]]
( ([TIME[2012-04-01 10:06:51 +09:00]] 版))
<http://bogusne.ws/article/41580267.html>
[24] [CITE[IRC logs: freenode / #whatwg / 20120419]]
( ([TIME[2012-04-24 21:49:36 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120419>
[26] [CITE@en[Web Applications 1.0 r7647 Embrace the Encodings specification.]]
( ([TIME[2013-01-24 10:38:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7646&to=7647>
[27] [CITE[Provide better encoding label guidance. (Basically require utf-8 all ove... · a454d2e · whatwg/encoding]]
( ([TIME[2013-02-16 12:48:30 +09:00]] 版))
<https://github.com/whatwg/encoding/commit/a454d2e543964b8d5432778ff917324e8032b78c>
[28] [CITE@en[Web Applications 1.0 r7782 Strip a leading BOM from scripts in workers, if any. Also, use more of the encoding spec.]]
( ([TIME[2013-03-30 03:45:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7781&to=7782>
[29] [CITE[ 3 - JNI Types and Data Structures ]]
( ([TIME[2011-09-07 21:57:56 +09:00]] 版))
<http://docs.oracle.com/javase/1.3/docs/guide/jni/spec/types.doc.html#16542>
[30] [CITE[jwerle/libutf8]]
( ([TIME[2013-12-16 00:12:32 +09:00]] 版))
<https://github.com/jwerle/libutf8>
[31] [CITE@en[Web Applications 1.0 r8405 Various editorial tweaks.]]
( ([TIME[2014-01-17 17:12:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8404&to=8405>
[32] [[Gmail]] の (日本語での?) デフォルト設定が2014年4月中頃に [[ISO-2022-JP]] から [[UTF-8]]
に変わったようです。 (13-17 の間?)
[33] [CITE@en-US[JNI Types and Data Structures]]
( ([TIME[2014-05-08 13:10:38 +09:00]] 版))
<http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16542>
[35] [CITE@en[Web Applications 1.0 r8722 Adjust notes on encoding detection]]
( ([TIME[2014-08-28 08:12:00 +09:00]] 版))
<http://html5.org/r/8722>