Unicodeの問題
2005年10月8日現在、自分はMicrosoftのVisual Studio2003を使ってプログラムを組んでいます。Linuxのプログラムも、Macのプログラムも、大半はこれを利用して組んでいます(ただし、実際の移植の際にはEmacsで各プラットフォーム用にコード修正をかけますが、大半はそのままで利用できるので、そのまま利用しています)。
ただ、例えば日本語表示をアプリケーションでやろうとした際、S-JISを利用するとLinuxやMacでは文字化けを起こしてしまいます。これは各プラットフォームで文字コードが異なるためです。
最近はUTF-8やUTF-16といったUnicodeがプラットフォーム間の差異を吸収してくれるようになっているので、文字化けなどは起こりにくくなってきていますが、実際はこれらの実装も各プラットフォーム間で同じかというとそうでは無いのが現状です。
例えば、ワイド文字列として利用可能なwchar_tも、WindowsではUCS2、LinuxではUCS4など、対応が異なります。また、UTF- 16ではU+110000以降の文字列を表現できないサロゲートペアの問題があり、UCS4を完全に表現できない(つまり、不完全なUnicodeである)などの欠陥があります。UTF-8は、可変長文字列としてUCS4の範囲を完全にカバーできる能力を備えているのですが、UCS4をUTF-8で表現しようとした場合、極端にバイト数が増えてしまうなどの問題もあります。
ただ、だからといってUCS2やUCS4を利用するにはAPIが揃っていないなど、実装だけでも一苦労しそうです(IBMのICUを利用するなどの解決方法はありますが、実装して配布するには、あまりにもサイズが大きすぎます)。
というわけで、現行ではchar型で扱えるUTF-8が一番実装しやすいようです。
また、UCS4があまり普及していない今では、UTF-8で文字サイズを気にするような大げさなファイルサイズの肥大化は起こりませんし、その点ではUTF-8はどの点でも優れているように見えます。
最近流行のXMLや、OSのロケールをUTF-8で統一する動きも加速しています。
そのため、外部ファイルをUTF-8で統一し、それを内部構造へ変換する仕組みを各プラットフォーム間で実装すれば、外部へ保存するファイルのテキスト形式を一つに統一することができ、ゲームや各アプリケーションの設定データやソースコードの読み込み、書き出しが楽になります。
それに、UTF-8からUCS2やUCS4への変換は、S-JISやEUCのように変換テーブルを利用する必要が無く、ただのビット演算で高速にできるといった利点もあります。これについては下記URLに詳細が書いてありますので、興味のある方は見てみるとよいでしょう。
http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm
というわけで早速、今日そのコードの実装を行い、自サイトのCVSリポジトリへインポートしました。興味のある方はSourceForge.jpプロジェクト名IlaliartのCVSリポジトリを覗いてみてください。それっぽい名前のフォルダの中にソースが入っています。
と、まぁ宣伝みたいになってしまいましたが、もうそろっと寝ないと明日の学会がやばいので寝ます(汗
ただ、例えば日本語表示をアプリケーションでやろうとした際、S-JISを利用するとLinuxやMacでは文字化けを起こしてしまいます。これは各プラットフォームで文字コードが異なるためです。
最近はUTF-8やUTF-16といったUnicodeがプラットフォーム間の差異を吸収してくれるようになっているので、文字化けなどは起こりにくくなってきていますが、実際はこれらの実装も各プラットフォーム間で同じかというとそうでは無いのが現状です。
例えば、ワイド文字列として利用可能なwchar_tも、WindowsではUCS2、LinuxではUCS4など、対応が異なります。また、UTF- 16ではU+110000以降の文字列を表現できないサロゲートペアの問題があり、UCS4を完全に表現できない(つまり、不完全なUnicodeである)などの欠陥があります。UTF-8は、可変長文字列としてUCS4の範囲を完全にカバーできる能力を備えているのですが、UCS4をUTF-8で表現しようとした場合、極端にバイト数が増えてしまうなどの問題もあります。
ただ、だからといってUCS2やUCS4を利用するにはAPIが揃っていないなど、実装だけでも一苦労しそうです(IBMのICUを利用するなどの解決方法はありますが、実装して配布するには、あまりにもサイズが大きすぎます)。
というわけで、現行ではchar型で扱えるUTF-8が一番実装しやすいようです。
また、UCS4があまり普及していない今では、UTF-8で文字サイズを気にするような大げさなファイルサイズの肥大化は起こりませんし、その点ではUTF-8はどの点でも優れているように見えます。
最近流行のXMLや、OSのロケールをUTF-8で統一する動きも加速しています。
そのため、外部ファイルをUTF-8で統一し、それを内部構造へ変換する仕組みを各プラットフォーム間で実装すれば、外部へ保存するファイルのテキスト形式を一つに統一することができ、ゲームや各アプリケーションの設定データやソースコードの読み込み、書き出しが楽になります。
それに、UTF-8からUCS2やUCS4への変換は、S-JISやEUCのように変換テーブルを利用する必要が無く、ただのビット演算で高速にできるといった利点もあります。これについては下記URLに詳細が書いてありますので、興味のある方は見てみるとよいでしょう。
http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm
というわけで早速、今日そのコードの実装を行い、自サイトのCVSリポジトリへインポートしました。興味のある方はSourceForge.jpプロジェクト名IlaliartのCVSリポジトリを覗いてみてください。それっぽい名前のフォルダの中にソースが入っています。
と、まぁ宣伝みたいになってしまいましたが、もうそろっと寝ないと明日の学会がやばいので寝ます(汗
コメント