View
1.352
Download
0
Category
Preview:
DESCRIPTION
Web技術勉強会 第34回
Citation preview
Web技術勉強会 第34回文字コードについて
Ryuichi TANAKA.Blog: http://blog.livedoor.jp/mapserver2007/
Twitter: @mapserver2007
UTF-8とUTF-16とUnicode
全部別物
この際勉強しよう!
発端
文字コードは複雑Unicodeって何?UTF-8とは違う?
用語の確認
UCS(UCS-4)Universal Character Setコードテーブルは0~0x7FFFFFFF(約21億文字分)1文字あたり4バイトを使用することからUCS-4とも呼ばれる文字集合
用語の確認
UCS-20~0xFFFF(65535文字分)16ビット以上の範囲の文字は扱えない
用語の確認
UnicodeUCSの0~0x10FFFF(約111万文字分)を使用 UCSとUnicodeは策定しているグループが違うが、UCSとUnicodeは同じ意味で扱われることがある
用語の確認
UnicodeUnicodeは元々16ビットですべての文字を表そうとしたのが始まり。無理にきまってんだろjkこれだからシングルバイト圏の人間は。
用語の確認
Unicode現在ではUnicodeは1文字4バイトで表現される1文字4バイトはUCS(UCS-4)と同じだが、使用範囲が限定されているUnicodeは00群0F面まで定義上の最大は127群255面まで
用語の確認
UTF-16UCS-2にサロゲートペアを併用した符号法元々は16ビットの固定長の符号サロゲートペアを併用することで大幅に使用範囲が増えた
用語の確認
UTF-16UTF-16ではファイルの先頭にBOMをつけるUTF-16ではUCS-2の範囲外の文字(=UCS-4から持ってくる)のうち、0x10000~0x10FFFFをサロゲートペアとして表す
用語の確認
サロゲートペアUTF-16で採用されたUnicodeの符号化法の一つサロゲート文字(≠サロゲートペア)として上位、下位それぞれ1024文字割り当てている
用語の確認
サロゲートペア 16ビットUnicodeの未定義領域の1024文字を2つ使用する上位サロゲートは0xD800~0xDBFF下位サロゲートは0xDC00~0xDFFFこれらを組み合わせたものをサロゲートペアと呼ぶ
用語の確認
サロゲートペア1024x1024=1048576文字を256x256の面(Plane)に分割、16面+BMP(Basic Multilngual Plane=基本多言語面=最もよく使う基本的な文字・記号がほぼすべて含まれる領域=0x0000~0xFFFF)の計17面、約111万文字が使用可能になる
用語の確認
BOMByte Order MarkUTF-16(UTF-8にもつけられる)の先頭につけるU+FEFE(0xFEFE)のことUTF-8ではEF BB BFBOMがつくとリトルエンディアンBOMがつかないとビッグエンディアン
用語の確認
UTF-81文字を1~6バイトの可変長バイト列で表現する符号法サロゲートペアを用いない広大な範囲を持つが、現在の標準仕様(RFC3629)では使用範囲が0~0x10FFFFのみに規定されている
用語の確認
UTF-8BOMがつけれれるBOMをつけたUTF-8はUTF-8Nと表記しかし、国際的には認められていない使われるのは国内のみ
まとめると範囲は
UCS-2⊆UTF-16⊆UTF-8(現行)⊆(UCS-4⊆真のUTF-8)
これだけ分かれてる。ややこしいんじゃぼけー
直近、俺らが困りそうなこと
サロゲートペア問題
サロゲートペア問題
サロゲートペア領域とUTF-16のデフォルト領域はビット数が違う
UTF-16のデフォルト:16ビットサロゲートペア領域:32ビット
つまり、デフォのUTF-16領域にある文字列は「2バイト」、サロゲートペア文字は「4バイト」になる。
これは実に重大な問題を引き起こすので無視できない。特にWebアプリで。
<html><head><script>function length(e) { alert(e); alert(e.length);}</script></head><body><input type="button" onclick="length('\u3042');" value="あ"/><input type="button" onclick="length('\u20B9F');" value="𠮟"/></body></html>
あら不思議。「あ」は1文字扱いなのに
「叱」は2文字扱いになっちゃった
これがサロゲートペアを扱う時の問題点。
例えば、ユーザの入力文字を「文字数」でバリデーションするとき。パスワードは最低8文字以上にしないと弾くという処
理を書いたとき。
入力フォームにサロゲートペア文字を含んでいる場合…。単にlength取っただけだと、あっさり8文字以下でも突破できちゃう。
それをそのままDBに突っ込んだ日にゃ。もうめちゃくちゃ。
やっつけまとめ
・文字コード(特にUnicode関係)はわかりにくすぎる・定義が曖昧(UCSとUnicodeの解釈が人によって違うとか)・とりあえずサロゲートペアには気をつけろ。・対策方法は そこら中にあるからそれを参考に!
Recommended