【アプリ版】サポートOS変更のお知らせ

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

gooドクター

A 回答 (3件)

実は「UTF」には 2種類あります. つまり, Unicode Consortium による Unicode Transformation Format と ISO による UCS transformation format です. ややっこしいんですが, これは Unicode が ISO 10646 を乗っ取ったという歴史的事情によります.


で, Unicode Consortium の UTF-8 ですが, これは昔から最大 4 octet です. あ, 本当の昔 (Unicode Standard 1 とか 2 とかの時代) は 16bit だったので最大 3 octet かな? u+10000 以上のコードポイントにも文字が割当てられるようになったので, 最大 4 octet に拡張されたのかもしれません. こっちは Unicode Standard 5.0 で確認済み.
これに対して, もともと ISO 10646 では 31bit の文字セットを考えていました. そのため, ISO 10646 では UTF-8 として 1~6 byte のものが定義されています. ただ, wikipedia によれば 2006年に「Unicode で定義されないコードポイントには文字を割当てない」ということが決まった (amendment がまだ出ていないので未確認) ということで, そうなると実際に用いられるのはやはり 1~4 octet に限られることになると思います.
    • good
    • 0
この回答へのお礼

最新の情報をありがとうございました。
最新の規格に留意しなければならないこと、わかりました。
どうもありがとうございました。

お礼日時:2007/10/17 22:33

UTF-8 には新旧があります.



> 「UTF-8は1~6バイトです」

これは古い方の UTF-8 (RFC2279(廃),1998年1月).


> 「Unicode値とUTF-8の関係」の表を見ると4バイトまで

これが現行の UTF-8 (RFC3629,2003年11月).

参考URL:http://www5d.biglobe.ne.jp/~noocyte/Programming/ …
    • good
    • 0
この回答へのお礼

Unicodeに歴史があり、規格が変わってきたことわかりました。
URLもとても参考になりました。
どうもありがとうございました。

お礼日時:2007/10/17 22:31

現状では存在しません。


#多分将来も

http://www.akanko.net/marimo/data/rfc/rfc3629-jp …

UTF-8はUnicode標準 [UNICODE] により定義される。また、説明と式は
ISO/IEC 10646-1 [ISO.10646]の付録Dで見つかるだろう

UTF-8において、U+0000..U+10FFFF範囲(UTF-16アクセス可能範囲)からの文
字は、1から4までオクテットの連鎖を使って符号化される。
1オクテット長の場合、その「シーケンス」の唯一のオクテットは、最上
位ビットは 0 がセットされており、残りの 7ビットは文字値を符号化する
ために用いられる。
nオクテットのシーケンス(n>1)は、最初のオクテットの最上位nビットに
は1をセットし、次に一つの0のビットをセットする。そのオクテットの残っ
たビットは、コード化される文字の値のビットを含んでいる。
続くすべてのオクテットは、最上位ビットに1が設定されており、そして、
次のビットが0にセットされ、残る6ビットでキャラクタをエンコードする。

下のテーブルは、これらの幾つかのオクテットタイプのフォーマットを要
約する。文字xは、文字番号のビットを符号化するために利用可能なビット
を示す。

文字番号範囲 | UTF-8 オクテット列
(16進数) | (2進数)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

このように定義されていますので

元となるUnicode が 31bitすべてを使ったものにはならず
約20bit(0x10_ffff) までに制限されているので
4バイトが最長になります。

が、素朴に変換するようなルーチンだとセキュリティホールの
元になりますので注意が必要でしょう。
    • good
    • 0
この回答へのお礼

早速の回答をありがとうございました。
いろいろ調べると、「UTF-8は1~6バイトです」とありながら、「Unicode値とUTF-8の関係」の表を見ると4バイトまでで、混乱していました。
現行は、Unicode値が20bit以内なので、UTF-8は4バイトが最長になる訳ですね。おかげさまで、これで、とてもすっきりしました。
どうもありがとうとざいました。

お礼日時:2007/10/15 16:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

人気Q&Aランキング