質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

12230閲覧

UTF-8の半角カナについて

fulio

総合スコア15

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

1グッド

1クリップ

投稿2017/07/05 05:10

文字コードの容量について教えてください。

データベースに格納されるUTF-8の文字が半角カナで3バイト必要とされている理由とはどのような理由があるのでしょうか。
UCS2で全角日本語が2バイトに対して、半角カナが3バイトなのは気持ち悪く感じてしまうので、ざっくりと教えていただけませんか。

x_x👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

UCS-2 は ASCII でさえも2バイトで格納する必要があり、既存のプログラムとの相性が非常に悪いのです。ASCII であれば必ず上位バイトに 0x00 が格納され、端末等に表示すると画面が化けたりバイト列の長さを調べる API が 0 を返したりと問題が起きやすいのです。UCS-2 を扱いたいプログラムはそれが UCS-2 である事を知らないといけない訳です。

それに比べ UTF-8 は 0x00 から 0x7F の範囲内で ASCII コンパチブルです。UTF-8 ではこの利便性を確保する為にコードポイントの領域に従った符号化方式を取ります。

UCS-2第一バイト第二バイト第三バイト第四バイト
0x0000~0x007F0AAAAAAA
0x0080~0x07FF110AAAAA10BBBBBB
0x0800~0xFFFF1110AAAA10BBBBBB10CCCCCC
0x10000~0x1FFFF11110DDD1110AAAA10BBBBBB10CCCCCC

バイト列だと以下になります。

コードポイント第一バイト第二バイト第三バイト第四バイト
U+0000~U+007F00~7F
U+0080~U+07FFC2~DF80~BF
U+0800~U+0FFFE0A0~BF80~BF
U+1000~U+CFFFE1~EC80~BF80~BF
U+D000~U+D7FFED80~9F80~BF
U+E000~U+FFFFEE~EF80~BF80~BF
U+10000~U+3FFFFF090~BF80~BF80~BF
U+40000~U+FFFFFF1~F380~BF80~BF80~BF
U+100000~U+10FFFFF480~8F80~BF80~BF

これにより、ASCII 範囲内で互換性が生まれ、多くのプログラムが UCS-2 への移植という苦行を行わなくても良くなり、みんなハッピーになる訳です。この方式を考え出したのはベル研の Ken Thompson 氏と Rob Pike 氏なのですが、多くの開発者から絶賛されました。

で、なぜ日本語が3バイトなのかを説明しますと、UCS-2 で日本語と呼ばれる物は以下の物です。

字種範囲
漢字0x4E00~0x9FA0
全角英数及びマーク0xFF01~0xFF5D
全角記号0xFFE3,0x818F
半角カナ0xFF61~0xFF9F

上の表に当てはめると何れも3バイトである事が確認頂けるかと思います。つまり UTF-8 は多言語を ASCII コンパチブルに扱う為に生まれた革命的な符号化方式なのです。

投稿2017/07/05 05:41

編集2017/07/05 05:44
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacsheaven

2017/07/05 06:04

UTF-8 の符号化方式が優れているのは他にも、 ・先頭バイトだけ見ればそれが何バイトで構成されている文字かわかる(=文字数のカウントがしやすい) ・複数バイトで構成されている文字の途中から読みだした場合に、それが途中であることが分かる(いわゆる文字化けを起こさせないで済む) といった点がありますね。
fulio

2017/07/05 06:21

ご丁寧な表ありがとうございます。 かなり良い文字コードなのがわかりました。
guest

0

例えば、
安直には、Wikiみて、
UTF-8
https://ja.wikipedia.org/wiki/UTF-8

実際の処は、裏付けをとるためにだったり、Wiki嘘が無い?の
確認の為に、
ISO/IEC 10646:2014がダウンロード可能になっています
http://yanok.net/2014/09/isoiec-106462014-1.html
の様なサイトを参考にして、規格の一次資料を探して、読込みます。

投稿2017/07/05 05:36

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fulio

2017/07/05 06:22

正確な情報ありがとうございます 規格の一次資料はネットで確認できるのですね、勉強になりました
guest

0

ベストアンサー

Unicode の U+0800 ~ U+FFFF は UTF-8 では 3 バイトになります。詳しくは以下の記事を見てください。

UTF-8
https://ja.wikipedia.org/wiki/UTF-8

質問者さんの言う「半角カナ」は Halfwidth and Fullwidth Forms(U+FF00 ~ U+FFEF)に入っているはずで、それゆえ UTF-8 では 3 バイトになります。

半角カナ
https://ja.wikipedia.org/wiki/%E5%8D%8A%E8%A7%92%E3%82%AB%E3%83%8A

Windows PC なら付属の IME パッドを見ると半角カナその他の文字コードが分かります。

投稿2017/07/05 05:52

編集2017/07/05 05:54
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fulio

2017/07/05 06:20

素早い回答ありがとうございました エディタで文字コード見ながら確認して納得できました。
faithandbrave

2017/07/05 07:10 編集

fulioさんの質問に対して、これが回答として成立しているのがよくわからないのですが、 「データベースに格納されるUTF-8の文字が半角カナで3バイト必要とされている理由とはどのような理由があるのでしょうか。」 という質問は、「データベースに格納される」という部分が重要で、「データベースだからではなく、Unicode/UTF-8でそう決まっているから3バイトなんだよ」という回答が求めていたものなのでしょうか? Unicode/UTF-8内で半角カナが3バイトになっている理由であれば、mattnさんの回答のみが理由になっていると思うのですが、その理由を求めていたわけではないのでしょうか?
fulio

2017/07/05 07:26

その通りですね。そもそもUTF-8をきちんと理解できてなかったので、UTF-8では3バイトの範囲になる、という解説で納得したということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問