Web技術勉強会 第34回

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="&#x3042;"/><input type="button" onclick="length('\u20B9F');" value="&#x20B9F;"/></body></html>

あら不思議。「あ」は1文字扱いなのに

「叱」は2文字扱いになっちゃった

これがサロゲートペアを扱う時の問題点。

例えば、ユーザの入力文字を「文字数」でバリデーションするとき。パスワードは最低8文字以上にしないと弾くという処

理を書いたとき。

入力フォームにサロゲートペア文字を含んでいる場合…。単にlength取っただけだと、あっさり8文字以下でも突破できちゃう。

それをそのままDBに突っ込んだ日にゃ。もうめちゃくちゃ。

やっつけまとめ

・文字コード(特にUnicode関係)はわかりにくすぎる・定義が曖昧(UCSとUnicodeの解釈が人によって違うとか)・とりあえずサロゲートペアには気をつけろ。・対策方法は そこら中にあるからそれを参考に!