• ベストアンサー

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」の完全変換は無理なのでは?と思っています。 ご存知の方すみませんがどうぞご教授ください。

  • mtsed
  • お礼率92% (77/83)

質問者が選んだベストアンサー

  • ベストアンサー
  • tabide
  • ベストアンサー率44% (148/331)
回答No.2

まず「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の一意相互変換は全く問題ないとお考え頂いて結構です。

mtsed
質問者

お礼

ありがとうございます。 よくわかりました。 UCS-2とUTF-16の違いを理解していませんでした。

その他の回答 (2)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

そもそも「文字セット」と「符号化」を ごっちゃにしてるのが混乱の原因でしょう. UNICODEが規定している「文字」を コンピュータ上ではどのように表現させるかが 「符号化」であり 符号化には UTF-8 とか UTF-16 があるということです. したがって, 元は同じものを違った表現で表してるだけです. 表現につかえるバイト数がいくら多くたって それを全部使うわけではありません. 実際は「すかすか」なのはNo.2さんの おっしゃるとおりです. すかすかにすることで「誤解のない表現」を 実現できます. そもそもSJIS/EUC/JISとかだって 大雑把には二バイトですので 65536 文字ですが, 65536文字もありません. 「すかすかで誤解のない表現」というのは 符号化ではよくあります。。 #相互互換で問題になるのは #JIS X 0208とかとUNICODEの方ですな

mtsed
質問者

お礼

ありがとうございます。 どうやら文字セットと符号化をごっちゃにしていてました。 すかすかということでありがとうございました。

回答No.1

 普通に考えれば UTF-16は 65535文字しか使えないのですが、それに気付いた偉い人はサロゲートペア という仕組みを作り出して回避しました。  これは 0xd800~0xdbffを上位、0xdc00~0xdfffを下位とした2つの 16bitをサロゲートとし、この組み合わせで 1024x1024文字分を作り出しました。  なので現状は 65536 - 2048 + 1024 x 1024 = 1112064文字が UTF-16で理論上表現可能な文字数となります。

参考URL:
http://www.wdic.org/w/WDIC/%E3%82%B5%E3%83%AD%E3%82%B2%E3%83%BC%E3%83%88%E3%83%9A%E3%82%A2
mtsed
質問者

お礼

ありがとうございました。 サロゲートペアを使用していたのですね。

関連するQ&A

  • UTF7について

    UTF7についてですがマッピングルールなどについて教えていただけないですか? 試しに「あああ」という文字をフリーのソフトでUTF7に変換したところ 2B 4D 45 49 77 51 6A 42 43 という感じでした。2進数でみてもまったく規則性がわかりません。 UNICODE→UTF8はわかるのですが、UNICODE→UTF7に変換するには どうすればいいのでしょうか?

  • UTF-8とASCIIコードにおける互換性について

    UTF-8とASCIIはそのASCIIコードの範囲のおいて 互換性を持ちます。(と、書籍や多種な文献にはそういった記述があります) たとえば【A】という文字をUTF-8で符号化した際は【41】(16進数で) さらにASCIIコードでも【41】という値がAという文字に割り当てられています。 確かに、一件互換しているようにみえますが、UTF-8っていうことは最終的には Unicode上のコードポイントの値・・・つまり0x0041という値に復元?(というのでしょうか)するわけですよね? でそのUnicodeの文字集合上から復元したコードポイントに対応する文字を参照しAという文字をみつけてくると・・・。 これって【A】という文字をUTF-8で符号化した歳のバイト列はASCIIと一致しているけれど 結局Unicodeコードポイントに直した場合【00】という上位バイトが無駄にくっついてきて【0x0041】となり 互換性がなくなるのではとおもったのですが・・・。 これはどういう意味の互換性なのでしょうか? 識者の方ご教授ください。 お願い致します。

  • 保存形式としてのUnicode、UTF-8

    「Unicode、UTF-8 違い」などでネットを検索すると Unicode・・・文字コード UTF-8・・・符号化方式 とのことで、同次元のものではないとのこと。 しかし、 さくらエディタ、TeraPadなどのテキストエディタの保存形式に Unicode、UTF-8などがあるのですが、この違いは何でしょうか? 前提として、iPhone/iPadにてテキストファイルを扱おうとすると Gmailの添付ファイル、Dropboxなどで文字化けする(デコードできない)ので どちらかの形式に統一しようと思ったのですが、 あとあと困るといやなので、正確に理解したいと思った次第です。 どうぞよろしくお願いします。

  • UTF8からUnicode(コードポイント)へ変換

    UTF-8の文字コードをUnicode(コードポイント)へ変換させたいのですが、参考URLの情報のように計算式を知りたいです 。 例えば下の「あ」は、16進では「E38182」、10進では「14909826」ですが、どちらかの値を利用してUnicodeのポイントコード「12354」を計算式を用いて求めたいです。 「あ」 Unicode = 12354 16進 = E38182 10進 = 14909826 参考 http://questionbox.jp.msn.com/qa500194.html

  • UTF-8とUTF-16について質問です。

    まず、【あ】という文字をUTF-16というエンコーディング方式で バイト配列化すると [0] => 66 [1] => 48 というバイト値が帰ってきます。 これはとりあえずC#で処理を行いました。 Encoding encode = Encoding.GetEncoding("UTF-16"); String value = "あ"; Byte [] byteData = encode.GetBytes(value); それでは【あ】という文字の文字集合のコードポイントは右記となります。【0x3042】 これは、出力された 66、48という数値を16進数に変換すると 66=>42 48=>30 となり、リトルエンディアン環境で 0x4230という16進数であらわされるようです。 この点も不思議なのですが今回知りたいのはUTF-16でエンコーディングされた バイト配列はこのように文字集合のコードポイントに復帰?させることができますよね? ではUTF-8でエンコーディングされた【あ】という文字の バイト配列 [0] => 227 [1] => 129 [2] => 130 というバイト配列を上記のような文字集合のコードポイントの値へ復帰させることは できるのでしょうか? それに伴いUTF-8でつかわれる文字集合もUTF-16と同じコードポイントなのでしょうか? 上記 1.UTF-8でエンコーディングされた文字列をバイト配列にした場合 元の文字集合に戻せるのか?戻せるならばその戻し方は? 2.UTF-8がさす文字集合とUTF-16がさす文字集合はおなじものですよね? 上記二点よろしくご教授ください。

  • Unicodeについて

    お世話になっております。 papillon68と申します。 [バージョン] SQLServer2005 (Management Studio Express 9.00.2047.00) 早速ではありますが、今回ご教授頂きたいことはSQLSERVERでのUnicodeの扱いについてです。 PHPとAjaxとSQLServerの連携を行っています。 ソース(PHPとAjax)はUTF-8で書いています。 ここで、SQLServerへのやりとりもUTF-8で行いたいのですが、どのようにしたらよいでしょうか。 文字列を扱う列の型は「nchar、nvarchar、ntext」などを使っています。 UTF-8でSQLServerに登録すると2バイト文字(ひらがな、漢字など)が 入力したとおりに保存されます。 ですが、SQLServerからデータをSELECT文で抜き出したときに 2バイト文字が化けてしまっています。 どのようにすれば文字化けせずにソースもSQLServerもUTF8で行うことができるのでしょうか。 お手数をお掛け致しますが、ご教授よろしくお願い致します。

  • UTF-8で5~6バイトになる文字コード

    UnicodeのUTF-8で5~6バイトになる文字コードは、どのような場合でしょうか。(サロゲートペアのコードでも4バイトです。シフトJISから変換するとき、どのようなコードが5~6バイトに割り当てられるのでしょうか。) ご存知の方おられましたら、ご教示ください。

  • UNICODEとは何なんですか

    Shift-JISからUTF8への切り換えを勧められ、 今、文字コードや改行コードについて調べています。 取り敢えずUTF-8への変換ツールをダウンロードしてきたところです。 それで凄く分からなくなったのですが、 UNICODEって文字コードを国際的に統一しましょうって規格ですよね。 Wikiを見たらUTF-7、UTF8、UTF-16、UTF-32とあって、 更に5や9もあって、UTF-8にもBOM付きだの何だのとありました。 まるっきり統一するぞってやる気が感じられないのですが どうしてこんなに乱立しているのですか? 今後はノーマルのUTF-8(BOMなし)だけを意識すればいいのでしょうか。 以上2点のうち分かる方で結構ですので宜しくお願いします。

  • UTF_16からUTF_8への変換で困っています。

    初めまして、こんにちは。 いきなりなのですが、C言語のプログラムをしていて聞きたいことがあります。 ユニコードのUTF_16で取得したデータを、UTF_8に変換するにはどうしたらいいですか?? 色々自分なりに探してみたのですが見当たりませんでした。 知っている方がいればよろしくお願いします。 あとWindowsAPIとはなんでしょうか??友人にその中にあるよと言われたのですが、C言語(プログラム自体)を始めたばかりなのでよく理解できません。 みなさんよろしくお願いします。

  • UTF-7のバイト長は、元のShiftJis文字列の最大何倍になりますか?

    ShiftJIS文字列をUTF-7に変換した場合、 バイト数は、最大で元の何倍になりますか?