2013年5月15日水曜日

【C】続・エスケープされたUnicodeをデコードする


いや,これはガチでお手上げだと思ってたんだけど.
じゃあなんでprintfは日本語を出力できるのよと.
そしたら文字エンコーディングとか文字セットとかの知識がないことが露見.
ひとまず知識を詰め込んでsetlocaleせずに…というか
localeが対応していないマシンで日本語を表示させることができた.

昨日変換しようとしていた【\u3042】こういったコード
これはUnicodeのいろいろある符号化の中でUTF-16というものだったんだね.
こいつをCコード上で得ようとすると
int c = L'あ';
で得ることができる.

一方で,
printf ("あ");
これで表示される'あ'っていうのは
int c = 'あ'; // 実際にはchar1個分でないため怒られる
E38182という値.
これはUTF-8と呼ばれるものらしい.

同じUnicodeで同じ【あ】という文字をコード化した数値でも
0x3042というUTF-16と,0xE38182というUTF-8と二通りある.

これが符号化というやつ.
そこで,UTF-8もUTF-16も同じUnicodeというルールに則っているため
キーマップなしに計算だけで相互変換が可能!
つまりUTF-16からUTF-8へ変換させてやれば
printf ("あ");
と同じように表示できるはず!
光が見えてきた!

どういう相互ルールがあるかというのは
http://www5d.biglobe.ne.jp/~noocyte/Programming/CharCode.html
の5.1.を参考にさせて頂きました.
UTF8-4は…いいやとりあえず.

ビット演算だけでどうにかなりそうね.
まぁジャバラーなのでビット演算すら経験が浅いのだが.

と,いうわけで昨日のuniDec関数から呼び出す関数を新たに設置.
uniDec関数内でUTF-16の数値部分を取得しているので,
UTF-16の数値⇒UTF-8のキャラクター
という変換を行う関数である.

そして昨日のuniDecもこの関数を呼び出すため少しだけ修正.

まさか自分でもできるとは思わなかった…!

0 件のコメント:

コメントを投稿