I18N : Ruby M17N の設計と実装

という事でるびまのRubyでのM17Nに関する記事から。

Rubyist Magazine – Ruby M17N の設計と実装

ロケール

Ruby 1.9 はそれぞれのシステムでロケールの取得を試みます。Unix 環境でも Windows 環境でも、環境変数 $LANG が設定されていた場合はそこからロケールを決定します。Windows で $LANG が設定されていなかった場合、GetConsoleCP を用います。こうして決定されたロケールを表すエンコーディングオブジェクトを取得するには、Encoding.find("locale") を用います。

なお、Ruby がシステムのロケールを理解できなかった場合、ロケールエンコーディングは ASCII-8BIT になります。

えー不評。。

ここはコンソールコードページではなくユーザーロケールをとってほしい。そうでないと色々ややこしいよ。コンソールのCPはDOSのための互換機能ぐらいに思ってほしい。

あと、

UTF-16 & UTF-32

先述の通り、Ruby 1.9.1 では UTF-16BE、UTF-16LE、UTF-32BE、UTF-32LE がサポートされています。これらは全て BOM *2なしのエンコーディングです。よって、U+FEFF は ZERO WIDTH NO-BREAK SPACE として認識されるので、BOM であることがわかっている場合は適宜削ってください。また、Ruby 1.9.1 では、"UTF-16" と "UTF-32" はサポートしていないことに注意してください。 ASCII 非互換なエンコーディングは一部の先述の通りサポートが限定されているので、本格的に扱いたい場合は UTF-8 に変換して扱うことが推奨されます。

BOMなしでUTF-16を扱うのはかなり考えさせられる。あるなしのオプションはあってもかまわないとは思うけど、LE,BE混在で処理が必要な場合にかなり困ると思うぞ。自分でエンコーディング追加しろってことか。

ということで、記事は一通り読んで頂くとして、WindowsのMUI/NLSの考え方と整合性を持たせながらRubyのM17N使うのはやっかいそうな感じです。

ああ、この文書でWindowsの場合にロケールと呼ばれている物はシステムロケールなのか、ちぇっ。

まぁMCI方式にした時点でって事だなぁ。

コメントを残す