スクリプトで文字コード変換
- 3. Ruby
文字を1バイト単位に分解したい
↓
String#unpack()メソッド。
とりあえず必要なパラメータは【C*】か【H*】。
- 4. Ruby
【C*】とは?
対象の文字及び文字列を任意の文字コードで
符号化した際の各バイト値を
0〜255までの8bitの範囲で
10進数で表現した値の配列を返すよ。
※スクリプトの文字コードによって返ってくる
合計バイト数は異なるよ
例えば、UTF-8やUTF-16
などによって都度かわってしまうよ。
- 5. Ruby
【H*】とは?
対象の文字及び文字列を任意の
文字コードで符号化した際の
各バイト値を16進数で表現し、それを連結した
形式の文字列を配列として返す。
- 6. Ruby
とりあえずやってみる。引数は【C*】だよ。
hoge =“あ”;
foo = hoge.encode(“UTF-8”).unpack(“C*”)
# => [227, 129, 130]
これは”あ”という文字をUTF-8で符号化
した場合のバイト列だよ。
- 7. Ruby
次に引数を【H*】と変えてやってみる。
hoge =“あ”;
foo = hoge.encode(“UTF-8”).unpack(“H*”)
# =>["e38182"]
という配列が返ってくるよ。
[“e38182”] は[227, 129, 130] を16進数に
変換したものだよ。
- 9. Ruby
[227, 129, 130]
この配列を再び、Unicode上の符号位置
に復号するためには?
print [227, 129, 130] .pack(“C*”)
と同じ【C*】引数でpackしてやればいい。
すると再び【あ】と表記されるよ。
- 10. Ruby
次に、16進数表記されたバイト列
["e38182"]
この配列を再び、Unicode上の符号位置
に復号するためには?
print ["e38182”].pack(“H*”)
と同じ【H*】引数でpackしてやればいい。
すると再び【あ】と表記されるよ。
- 12. PHPの場合。
まずは
【mb_convert_encoding()】関数で
対象の文字列を任意の文字コードに変換。
その後、Rubyと同じく
【unpack()】関数でバイト単位の配列が
返ってくるよ。
- 13. PHPの場合。
やってみる。
<?php
$hoge =“あ”;
//今回は明示的に文字コード変換してみる。
$hoge = mb_convert_encoding($hoge,”UTF-8”,”UTF-8”);
print_r(unpack(“C*”,$hoge));
Array ( [1] => 227 [2] => 129 [3] => 130 )
という配列が返ってくるよ。
- 14. PHPの場合。
もとの[あ]という文字に戻すときは?
print_r(pack("C*",227,129,130));
という風にやってやると元の[あ]という文字に
戻すことができるよ。
※注意するのは第二引数以降は配列じゃなくって
各バイト値を順に渡していく点。
- 17. unpackやpack・・・一体何をしてるの?
では、pack関数やunpack関数(メソッド)は
内部で何をしているのか?
実行中の文字コードに則った符号化処理をやってるよ。
unpack => (与えられた文字を)符号化
pack => (与えられたバイト列を)復号化
特に、print_r(pack(“C*”,227,129,130));
のところなんてRFCに定義されているUnicode上の
コードポイントを3byteの値に置き換える
UTF-8の符号化計算を
まるまるやってくれているのがわかるよね。
- 18. ちなみにもしUTF-8じゃなくてUTF-16でunpack/packすると?
Rubyだと?
hoge = “あ”
hoge = hoge. encode ("UTF-16")
arrayObj = hoge.unpack("H*")
#=> ["feff3042"]
PHPだと?
$hoge = "あ";
$hoge = mb_convert_encoding($hoge,"UTF-16","UTF-8");
print_r(unpack("H*",$hoge));
Array ( [1] => 3042 )
- 20. BOM?
実は、UTF-16はリトル・エンディアンというものが
許容されている。LEね。
これは、例えば【あ】という文字をUnicodeだと【U+3042】
となるよね?でも実は【U+4230】でも【あ】とすることが
できるんだよね。これがリトル・エンディアン。
じゃあ本来の【U+4230】はどうなるかというと
【U+3042】というコードポイントで表現されることになる。
BOMとはこのLEかあるいは、本来の表記であるBEと呼ぶ
ビッグエンディアンかを判断するためにファイル先頭に
くっつける記号なんだ。