Stringと文字コード、RubyとJava

Rubyの文字列における文字コードの扱いは1.9以前と以降
で大きく変わりました。


Ruby1.8の文字列クラスは文字列をバイトコード配列として
内部に保持していますが、文字列の文字コード情報は保持
していません。文字列に対して文字コードによって変化する
処理を行うメソッドを呼び出す場合、外部から文字コード
指定する必要があります。メソッドの引数で指定しなかった
場合、実行環境のデフォルト文字コード($KCODE)が使われ
ます。


Ruby1.9の文字列クラスは自身の文字コード情報を保持して
います。文字列に対して文字コードによって変化する処理を
行うメソッドを呼び出す場合、内部で保持する自身の文字コード
情報を利用します。外部からの文字コード指定は必須では
なくなりました。


Rubyで外部から文字列を読み込む場合、1.9からは読込時に
おける文字コードの指定が可能になりました。読込時に
文字コードを指定しておくと、文字列に自身の文字コード
情報がセットされます。読込時に文字コードを指定しなかった
場合、1.8と同様に文字コードを引数に持つメソッドでは
必ず文字コードを指定する必要があります。
(force_encodingメソッドで後から文字列の文字コード
情報を強制的にセットする(書き換える)ことは可能です。)


Javaの文字列クラスはRuby1.8と同様に自身の文字コード
情報を持ちません。


JavaがRuby1.8と異なる点は内部文字コードUTF-8UTF-16
(Java1.4まではUCS-2)に統一(決めうち)している点です。Java
文字列クラスは文字列の文字コードUTF-8UTF-16
あるものとして処理を行います。


Javaの文字列にUTF-8UTF-16でない文字列を渡した場合には
文字化けを起こすことがあります。UTF-8UTF-16でない
文字列は受け取ったら即座にUTF-8UTF-16
変換する必要があります。

推敲中...?