FC2ブログ

Ctrl + Z

人生をUndoしよう

 
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
01


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

UnicodeとUTF-16&UTF-8 (2)

前回に引き続き、Unicodeに関するまとめ2回目です。



前回、Unicodeは、21bitの文字コードということが判りました。そこで、そのコードをそのままメモリに格納するとしたら、32bit変数か、24bitの変数に入れなければなりません。

でもでも、1文字4byteになってしまったら、今までascii(7bit)のデータで済んでいた、英語圏の人たちからしてみたら、データ量が4倍になってしまいます。
もともと、Unicodeが16bitに収まるだろう、ということで考えられており、1文字2byteで済むのであれば、まあ問題ないだろうという判断ができるはずです。

というわけで、Unicodeのデータを、何らかの方式で符号化(エンコード)しようと考え、UTF-16やUTF-8という符号化ができました。



UTF-16


UTF-16は、16bit (2byte)が最小単位となり、最大16bit×2の32bitで文字が表されます。
Unicodeは基本多言語面(BMP)の16bitで、大体の文字が使用できるので、通常は、良くつかわれる16bitだけで済ませ、たまにしか使われない文字は32bitで表せばいいよね、という考えのもと、符号化されます。

正確には、BMPのU+0000~U+D7FFとU+E000~U+FFFFの範囲は、そのまま2byteとなり、それ以外は、4byteになります。

4byteであらわされる場合、サロゲートペアという仕様があり、前半0xD800~0xDBFF, 後半0xDC00~0xDFFFを対にして、一文字を表すことになっています。

UTF-16の利点
・16bitの場合、UnicodeのBMPと互換がある
・ほとんどの文字は16bitで収まるため、サロゲートペアさえなければ、任意の位置が何文字目かを簡単に判別できる。
UTF-16の欠点
・エンディアンによって、バイト列が異なる。(エンディアンとは、バイトオーダーの事で、多バイトのデータを格納する際、バイトデータを上から入れるか、下から入れるかの違い。Windows+Intel CPUでは、リトルエンディアン)。エンディアンを判別するため、先頭にBOMを入れる必要がある。
・asciiの言語圏では、データサイズが倍になる。


サロゲートペアの文字を使う機会は少なく、また、フォントの対応等も必要で、サロゲートペアに対応していないアプリケーションもあったりするため、通常は16bitのみの文字列として考えて、差し支えありません。
そのため、文字数カウントも容易です。

一番大きな欠点は、エンディアンの問題で。エンディアンは使用するCPUで決まり、Intelの場合、リトルエンディアンとなります。メインフレームやJAVA仮想マシンではビッグエンディアンとなっており、エンディアンが異なるとバイトオーダーが入れ替わってしまうため、通信等で文字データをやり取りした際、異なった文字として認識され、文字化けの原因となってしまいます。
そこで、BOM(Byte Order Mark)を先頭につけ、リトルエンディアンか、ビッグエンディアンかの判定ができるような仕様が盛り込まれています。

BOMの仕様では
- BOMが付いていた場合、その値で、リトルエンディアンかビッグエンディアンかを判別
- BOMが付いていなかった場合、ビッグエンディアンとなる。
ただし、Windows上のUnicode文書では、BOMが無い場合、UTF-16LE(リトルエンディアン)とみなされます。
そのため、色々厄介な状態になっています。




UTF-8


UTF-8は、8bit(1byte)が最小単位となり、16bit(2byte), 24bit(3byte), 32bit(4byte)と文字によって、byte数が変わってきます。

AsciiとUTF-8の8bitのみの時が、イコールであるため、英語圏の文字は、そのままUTF-8にすることが出来ます。
2byteとなる場合は、第1バイトの頭3bitが、110から始まり、第2バイトは10から始まります。
3byteとなる場合は、第1バイトの頭4bitが、1110から始まり、第2、第3バイトは、10から始まります。
4byteとなる場合は、第1バイトの頭4bitが、1111から始まり、第2、第3、第4バイトは、10から始まります。


UTF-8の利点
・asciiは、1byteで済む。データの変換も必要なし。
・エンディアンの制約を受けない
UTF-8の欠点
・任意のbyte位置が、何文字目かを判断するためには、先頭から数えて行く必要がある。
・言語によっては、1文字3byte以上必要。(日本語は全て3バイト以上になる)


Asciiは、そのまま1byteで表されるため、データ量は非常にコンパクトになります。例えば、HTMLやXML、JavaScriptやCSSなどは、アルファベットで書かれた部分が比較的多く占め、それらの文字が1byteで済めば、通信の際のデータ量も少なくて済みます。

そのかわり、日本語のような言語では、1文字表すために3byte以上必要となってしまいました。
まあ、仕方ない気はします。(単純に字数だけで、日本語と英語を比べたら、英語のほうが多くなってしまいますし・・・)

また、UTF-16であった、エンディアンの問題は、8bit単位のUTF-8場合発生しません。

欠点は、文字数取得や、任意の位置が何文字目かを判別するためには、先頭からカウントしていかなければならない点です。符号化した状態で、文字列処理をするのは大変だと思います。




実際のところ、プログラミングを行ううえで、UTF-16やUTF-8など、あまり気にしない場合のほうが多いかと思います。最近の言語は、文字列型というのがあり、データは隠蔽されているため、生データに触れる機会は少なく、外部への入出力の際にのみ気をつければ、大体問題なく使えてしまうはずです。

何はともあれ、日々何気に使用しているものであっても、ちゃんと調べてみると、色々な事がわかって面白いですね。


参考サイト
http://ja.wikipedia.org/wiki/Unicode
http://ja.wikipedia.org/wiki/UTF-16
http://ja.wikipedia.org/wiki/UTF-8
http://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
http://www5d.biglobe.ne.jp/~noocyte/Programming/CharCode.html
http://www.kanzaki.com/docs/jcode.html
http://diveintopython3-ja.rdy.jp/strings.html



間違い等、ありましたら、ごめんなさい。















スポンサーサイト


Comments

Leave a Comment


Body

プロフィール

Green

Author:Green
思ったこと、興味があることなどを適当に。
プログラミングとゲームの話が多いかも。

主に使ってるプログラミング言語
・C++
・C#
・Visual Basic
・Python

email address

最新コメント
最新トラックバック
月別アーカイブ
 
 
 
 
 
リンク (ゲーム)
 
 
Amazon
ゲーム

[2012/05/24] ドラゴンズドグマ(数量限定特典『バイオハザード6』体験版用DLコード同梱)  
  [2012/07/05] 世界樹の迷宮IV 伝承の巨神 (特典 ブックレット付きサウンドトラックCD付き)  
  [2012/07/19] ルーンファクトリー4 (特典 こっそり聴きたい添い寝CD(特製ヘッドフォン付き)付き)  
  [2012/08/02] ドラゴンクエストX 目覚めし五つの種族 オンライン(通常版)
[2012/08/02] ドラゴンクエストX 目覚めし五つの種族 オンライン (Wii USBメモリー16GB同梱版)  
  [2012/08/30] 初音ミク -Project DIVA- f(予約特典:デザイン保護フィルム(PlayStation(R)Vita専用)付き)  
 



DVD / Blu-ray

[2012/07/18] 映画けいおん! (Blu-ray 初回限定版)

[2012/08/29] [初音ミク]ミクの日大感謝祭 2DaysコンプリートBOX(初回受注生産限定盤) [Blu-ray]
 
 
Amazon
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。