工藤探偵事務所

Resarch and Investigation

ルビー3分クッキング 第六回「日本語を表示する」の巻

kudo-shunsaku2008-04-01


3分間で覚える Ruby のトピックスです。
でも、本家同様に実際には10分程度掛かります。

大事なのは小さな積み重ねと継続する才能ですね。


第六回は、「日本語を表示する」の巻です。

今回は日本語の基本的な表示をやってみましょう。

Rubyに限らずプログラムで日本語を扱う場合は沢山あると想いますが、プログラムで日本語をつかう際には少なからず努力が必要であり、それはコンピュータでの文字の扱いは複雑なままだからです。文字集合文字符号化方式 の違いとか。。。ですので日本語の細かい操作行うには、実際かなり深い知識が必要になってくるでしょう。

このシリーズでは第一回から日本語は登場していますが、ここでもおさらいを兼ねながら Ruby での日本語の使い方を紹介していきましょう。

まずは Windows で日本語を出力してみます。
Windows で使われている文字エンコーディングは、"Shift_JIS" です。(正確にはShift_JISを拡張した「Windows-31J」と呼ばれるWindows標準文字セットである。との事ですが、Ruby ではShift_JISという指定を使います。)

Ruby インタプリタを実行する際に、ソースコードスクリプト)には "Shift_JIS" で書かれていますよ、と教えてあげる必要があります。

日本語を使う方法で一般的なやり方だと想われるのが、ソースコードの先頭に文字エンコーディングを指定するやり方です。

ファイル名は、"japanese_sjis.rb" などとして下さい。

#! ruby -Ks

puts "焼き鮭の香味ソース"

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby japanese_sjis.rb
焼き鮭の香味ソース

C:\rubycode\3minutes2cooking>

日本語の文字エンコーディングは、"-K" というオプションで指定します。"-K" というのは、「漢字」とかそんな意味なのでしょうね、たぶん。

"-K" オプションで指定出来るのは、"e" "E" は "EUC"、"s" "S" は "SJIS"、 "u" "U" は "UTF8" という意味に解釈されます。また指定しないのを明示する場合には、"n" "N" は "NONE" とします。

第一回で行った場合は、コマンドラインから、"-Ks" と指定しました。ソースコードの先頭に書いた場合も、コマンドラインから指定した場合も、どちらも同様の意味で解釈されます。状況にも因りますが、ソースコードに書いておくのが無難かもしれませんね。

先ほどの "-K" オプションの指定は、組み込みの変数である "$KCODE" に格納されます。

ですから、もう一つの指定方法としてはこの "$KCODE" の変数を変更する方法があります。

先ほどのコードを書き換えてやってみましょう。

$KCODE="S"

puts "スモークサーモンのケッパー添え"

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby japanese_sjis.rb
スモークサーモンのケッパー添え

C:\rubycode\3minutes2cooking>

これも第五回で既に紹介済みでしたよね。
指定の際ですが、ただの "S" ではわかりづらいという方は、判りやすく "SJIS" としても構いません。こんな風に、

$KCODE="SJIS"

でも指定としては、 "S" で十分な様子です。

"$KCODE" に値を代入するときは最初の 1 バイトしか意味がなく、また大文字小文字の違いも無視される、との事なのです


今度は違う文字エンコーディングも試してみましょう。

Linux の上で、"UTF-8" で書いたソースコードスクリプト)を実行してみます。

ファイル名は、"japanese_utf8.rb" などとして下さい。

#! ruby -Ku

p $KCODE

puts "秋鮭のちゃんちゃん焼き"

実行時、コンソール画面。

[ruby@fryingpan src]$ ruby japanese_utf8.rb
"UTF8"
秋鮭のちゃんちゃん焼き
[ruby@fryingpan src]$


ちゃんと実行出来ました。

もう一つ、先ほどご説明した様に、"-K" というオプションで指定すると "$KCODE" に格納される筈なので、印字して確かめてみました。"UTF8" という文字列が格納されていることがわかります。

ここでちょっと注意ですが、このサンプルを実行する際には、UTF-8 で表示できるターミナル・エミュレータが必要になります。Windows 付属のコマンド・プロンプトでは通常 "Shift_JIS" でしか日本語を表示出来ません。(Windowsでも chcp など使って頑張れば "UTF-8" を表示できるかもしれませんよ。)

今回はたまたま Linux が使える環境がありましたので、そこで実行しました。表示はターミナル・エミュレータ側で "UTF-8" で表示させて確認したのです。



今回は Ruby で日本語を表示をやってみました。

当たり前のことかもしれませんが、ここで一つ気が付いたことがあります。それは、「Rubyスクリプト言語」であるということです。日本語を扱う場合、特にソースコードをどの文字エンコーディングで書いたのか?が重要になります。そのソースコードを直接インタプリタが実行するのですから。

例えば、Java のプログラムであればコンパイラにより、一旦全てバイトコードに変換されてから、JVM (Java Virtual Machine) 上で実行されるのです。これにより Javaソースコード内での文字の扱いは、unicode に統一されています。Java の場合であれば、unicode の扱いに気をつければ良いことになります。勿論、出力する際に適した文字エンコーディングにしなければなりません。

言語の実行の仕組みである「コンパイラ v.s. インタプリタ」という構図だけでなく、実際に実行する処理系に因っても色々な差異が生じることでしょう。注意が必要な箇所です。

そして 肝心の Ruby でも単に表示だけではなく、日本語の文字列として様々な操作することも当然あることでしょう。そして日本語の取り扱いに困惑する場面もあるでしょう。それはまたの機会にお話出来ればと想います。


「たらこー♩たらこー♩つ〜ぶぅつ〜ぶぅ♫たらこー♩」

今日はここまで。次回をお楽しみに。