こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPにおいて16進数のアスキー文字とユニコード

文字列の明確な違いがわかりません。

たとえば16進数のアスキー文字であれば

print "\x41";
とした場合 
A
という文字が出力されます。
また
print 0x41;
とした場合はアスキー文字ではなく
65という10進数における数値が出力されますね。
さらには
print "\xe6\x96\x87\xe5\xad\x97\xe5\x88\x97";
と記述すると
文字列 という文字が出力されます。

ではそうではなくユニコード文字列というのはなんなのでしょうか?

一般てきに \u0000
という形式で表記される物ですが、コレがいまいちわかりません。
これは16進数のアスキー文字によるマルチバイト文字の再現と何がことなるのでしょうか?
たとえば、JSONなんかを単純に出力してみるとこのユニコード文字列という形式で表現されますよね?

このユニコード文字列の実態?を知りたいです。
よろしく御願いします。

投稿日時 - 2012-07-09 21:34:08

QNo.7581378

すぐに回答ほしいです

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

サクッと本題へ
一つ目の質問
A,出来ます
色々とやり方があります
コードを文字に変換し用意されている関数を使うこと
変換した後でコード化すれば任意のコードになるかと
・mb_convert_encoding('文字列','変換後コード','変換前コード')
・PDF_utf16_to_utf8 — 文字列を UTF-16 から UTF-8 に変換する
・PDF_utf32_to_utf16 — 文字列を UTF-32 から UTF-16 に変換する
・PDF_utf8_to_utf16 — 文字列を UTF-8 から UTF-16 に変換する
http://codezine.jp/article/detail/2668

二つ目の質問
A.はい、そうです
基本的にUnicodeと言えばUTF-16のLEなんですけれど
UTF32はマルチバイト文字列圏内では表現出来る文字が増えて嬉しい限りでしょうが
逆にマルチバイト文字列圏外では余計な情報なんですよね……
本当はUTF-8でも良いくらい、でもそれじゃマルチバイト圏内の人を蔑ろに……
なら、間を取って16にしようや……ってのが現在
なのでWindowsでUnicodeと言って使われているのは全国共通でUTF-16LE

先のURL先でffffと入れてみたら分かると思いますが1000のFなんですよね
……桁数が溢れてるんですよ、基本的にマルチバイトを使いたくなければ必要のない情報です
使いたければUTF-32にすればいいし、使いたくなければUTF-16にすればいいし
ただし、UNIX環境とかで使ってるコードは英語のみだぜ!って事ならUTF-8を使ったほうがいいです
英語圏のコードとかも入れやすいし……

投稿日時 - 2012-07-11 10:21:54

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

全てのコンピュータ上で統一された規格がユニコードになります
UTF-8やUTF-16の数字の部分は区切るビット幅
文字を8ビットごとに表しますよ、16ビットごとに表しますよってこと

\u 00 00
ユニコードの0000
これは制御文字列のユニコードなのですが例えが悪いです
全て0なので区切りが……
例が16進数なので16進数で説明すると
\u(ユニコード接頭) 000(レコード) 0(フィールド)
だったかな?

エクセルを思い浮かべてください
あのセル一つ一つに文字が入っていて
「\u010A」と表記することで決められている場所に入っている文字を読み取りに行ってる感じです
そしてコードごとに入っている文字を決めたのは
ゼロックス社を始めとするユニコードコンソーシアムと言う団体

リンク先も是非一読してみてください(特に二番目)
Hexに4桁の16進数を入れれば意味がわかるはずです
http://ja.wikipedia.org/wiki/Unicode
http://code.cside.com/3rdpage/jp/?charset=utf-8&g=symbols_and_punctuation&s=1010&e=1013

投稿日時 - 2012-07-10 10:03:15

お礼

ご回答ありがとうございます。

UTF-8とUTF-16の違いは
ユニコード・・・・日本語でいうと文字集合(だいたいこの言葉で紹介されていますよね?)
の【コードポイント】文字の通し番号みたいなものを表現するための方式の違いという理解ですいいですかね?
UTF-8は日本語一文字がだいたい3バイトで表現されるという説明が大半かとおもいます。

追加で申し訳ないですが二点質問致します。

一点目=>
本質問で、例に挙げた
【文字列】と言う文字をUTF-8の形式であらわすと
「"\xe6\x96\x87\xe5\xad\x97\xe5\x88\x97"」
という形になると描きましたが、日本語一文字が16進数形式の8ビット 三つ分で表現されていますね。

ただ、ユニコードの表現方式の一つというと例えば最初の文字列という文字の【文】という箇所をUTF-8とだと【\xe6\x96\x87】
となりますが、これはなにかしらの方法で、本来の【文】という文字を表現するユニコード(文字集合)のコードポイントである \u○○○○の形式に変換すること(言い方を返ると戻すこと?)もできるということでしょうか?
回答いただいたURLでしらべてみると6587番目が【文】という文字が格納されていますね。
つまり 【\xe6\x96\x87】を【\u6587】へとPHP上で変換できるのかどうか?

二点目=>
たいしてUTF-16というのは英語・日本語等のマルチバイトな文字問わず一文字16ビットで表現するエンコード方式という解釈でいいでしょうか?
すべての文字が\u0000 ~ \uFFFFの範囲で表現されるということですよね?
ただこの場合、もちろん2の16乗分・・・・・つまり65536文字分しか文字集合としてまとめることができず
結果、マルチバイト圏から不満の声がでたと各サイト等でありました。

そこでさらにもともとのユニコードから拡張したUTF-32が発案されて \u○○○○○○の六桁まで表現できるという感じですかね?
つまり【\uFFFF】番目以降の文字を表現するためにはUTF-32でエンコードすることが必要ということなのでしょうか?

投稿日時 - 2012-07-11 00:40:18

あなたにオススメの質問