ARGENTO CUORE

 May the code be with you.

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.05.28[金] 文字コードというもの

携帯とウェブ両方でサービスを行うサイトのシステム、その文字コードは一体何にしたら良のだろうかと調べると、http://miniturbo.org/2006/12/29/034842に、2006年の記事ですが、携帯機種ごとの文字コード対応表がありました。

2006年の時点で、携帯は元々Shift_JISが使われていたようですから、全ての携帯はShift_JISに対応していたようです。しかし、UTF-8、EUC-JPには対応していないものもあるようで。
今現在は2010年ですから、今発売されている携帯はほぼ全てUTF-8に対応していると考えて良さそうです。根拠はありません。
けれども、4年前の携帯を使っている人がどれほどいるかと思うと、機種を次々に切り替える人もいれば、私の父のように、4年5年と、メールと電話とネットが見れればそれで構わないという形で、買い替えない人もいます。

日本語向けサービスである限り、UTF-8である必要はなく、Shift_JISで問題はないのですから、これを使うのが、一番安全のような気がしてきました。けれども、国際化を考えずとも、UTF-8でシステムは構築されることが多くなってきています。内部エンコーディングと、外部エンコーディングが異なる場合、特殊な文字をシステム内部に保持するために、要らぬ苦労をしなければならくなりそうで、それはそれで、怖いです。

昨日、ふと、インタープリタ言語を作るべく、コーディングを開始しました。
Javaは内部エンコードとしてUnicodeを使用していますが、私はUTF-8として文字のデータを扱いたかったので、InputStreamReaderに"UTF-8"のオプションを渡すことで、UTF-8として読み込むようにしました。

ところが、

UTF-8として読み込んだはずのreaderに対し、read()メソッドを呼び出し一文字を取得します。それはInt型の値を帰してくれるのですが、ここでふと思いました。JavaのInt型は符号付き32bitです。つまりは、文字を表現するのに16bit扱えるということで、16bitということは、2バイトになります。

UTF-8の一文字を表現するのに必要なバイト数は、可変長です。英数字は1バイトであり、日本語はそのほとんどが3バイトを使用します。そこで試しに、受け取ったInt型を16進数に直して表示すると、立派なUTF-16のコードが出てきました。

私がInputStreamReaderに渡してあげたUTF-8というパラメータは、上手い具合に変換してくれるものではなかったようです。
人生、思うように上手くはいかないものですね。


- 追記 -

内部でUTF-8のバイト列を得るためには、以下のようにする(Scala)。
val r = reader.read() // Int
val str = String.valueOf(r.asInstanceOf[Char]) //String
var bytes = str.getBytes("UTF-8") //Array[Byte]


めでたしめでたし
スポンサーサイト

Comment






(編集・削除用)


管理者にだけ表示を許可

Trackback

http://ronor.blog81.fc2.com/tb.php/99-dcb91341

この記事にトラックバック(FC2Blog User)

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。