- ベストアンサー
UTF-8とUnicodeの互換性
Windowsで使用されているUnicodeはUTF-16と理解しているのですが、 UTF-16→UTF-8は変換できると思いますが、 UTF-8→UTF-16の変換は一意に変換されるものなのでしょうか? UTF-16は2バイトなので65,535文字が上限になり、 一方UTF-8は1~6バイトで、実質データ部は最大4バイトなので 表現できる文字数が違うので「UTF-8→UTF-16」の完全変換は無理なのでは?と思っています。 ご存知の方すみませんがどうぞご教授ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず「1文字が2バイト(16ビット)幅固定」というのは、UTF-16ではなくUCS-2のことです。 UCS-2はコードエリア0000~FFFFの65536文字分のみを表現できる、ある意味Unicodeのサブセットです。 UTF-16とは、サロゲートペアという仕組みを導入することで、UCS-2との互換を保ったまま、000000~10FFFF(D800~DFFFはサロゲートペア用のため除外)の1112064文字分を表現できるようにしたもので、正確には16/32ビット幅のマルチバイト文字コードです。 今日、普通にUnicodeといえばUTF-16形式を指しますが、初期版ではUCS-2でした。 UTF-8は、確かに理論上は00000000~7FFFFFFFまで表現可能ですが、Unicodeで実際にコードエリアとして定義されているのは10FFFFまで(しかもその中身はスカスカで、エリアがこれ以上拡張される可能性はまずない)なので、UTF-8とUTF-16の一意相互変換は全く問題ないとお考え頂いて結構です。
その他の回答 (2)
- kabaokaba
- ベストアンサー率51% (724/1416)
そもそも「文字セット」と「符号化」を ごっちゃにしてるのが混乱の原因でしょう. UNICODEが規定している「文字」を コンピュータ上ではどのように表現させるかが 「符号化」であり 符号化には UTF-8 とか UTF-16 があるということです. したがって, 元は同じものを違った表現で表してるだけです. 表現につかえるバイト数がいくら多くたって それを全部使うわけではありません. 実際は「すかすか」なのはNo.2さんの おっしゃるとおりです. すかすかにすることで「誤解のない表現」を 実現できます. そもそもSJIS/EUC/JISとかだって 大雑把には二バイトですので 65536 文字ですが, 65536文字もありません. 「すかすかで誤解のない表現」というのは 符号化ではよくあります。。 #相互互換で問題になるのは #JIS X 0208とかとUNICODEの方ですな
お礼
ありがとうございます。 どうやら文字セットと符号化をごっちゃにしていてました。 すかすかということでありがとうございました。
- PROMETHEUS
- ベストアンサー率58% (31/53)
普通に考えれば UTF-16は 65535文字しか使えないのですが、それに気付いた偉い人はサロゲートペア という仕組みを作り出して回避しました。 これは 0xd800~0xdbffを上位、0xdc00~0xdfffを下位とした2つの 16bitをサロゲートとし、この組み合わせで 1024x1024文字分を作り出しました。 なので現状は 65536 - 2048 + 1024 x 1024 = 1112064文字が UTF-16で理論上表現可能な文字数となります。
お礼
ありがとうございました。 サロゲートペアを使用していたのですね。
お礼
ありがとうございます。 よくわかりました。 UCS-2とUTF-16の違いを理解していませんでした。