ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    Ruby on Rails 学習日記 その4 文字コードの指定方法

    このエントリーを含むはてなブックマーク はてなブックマーク - Ruby on Rails 学習日記 その4 文字コードの指定方法 あとで読む
    RubyでWebサービスを作ろう!(・∀・)


    ruby logo


    今日は、Rubyの文法を学びました。

    Ruby入門 - RubyLife

    基本文法
    まずはRubyの基本文法について確認します。プログラムの記述の仕方を確認し、変数や制御構文の使い方を確認します。



    Rubyプログラムの基本事項 - Ruby入門
    ・基本的には、1行に1つの処理を記述する。
    ・構文の区切りの記号は「;」=1行の中で処理を続けて書くには「;」で区切る。
    コマンドラインでRubyスクリプトを実行するには、「ruby ファイル名」と書く。
    ・コメントの記号は「#」。
    ・複数行に渡るコメントは、埋め込みドキュメント「=begin」「=end」で囲む。
     →各行頭に「#」を書いても同じこと。

    日本語と文字コード - Ruby入門
    ・プログラム中の文字列の文字コードは $KCODE の値を使用

    ここでエラー発生!!!
    warning: variable $KCODE is no longer effective
    というエラーメッセージが出ました。><

    ググってみると、
    $KCODE is no longer effective - Kazzzの日記

    M17N対応の施されたRuby1.9系は、$KCODEは使わない。ということらしい。


    とのこと。

    スクリプトのエンコーディングを指定するには代わりに何を使えば良いのだろう。

    Ruby1.9はM17N対応にJavaや.NET等が使用しているUCS(Universal Character Set)Normalization方式※ではなく、CSI(Code Set Independent)方式を採用しているため、メモリを覗いてエンコーディングを決め打ちすることができないため、なんらかの方法で明示的にスクリプトのエンコーディングを与える必要がある。

    1. マジックコメント
    2. コマンドラインオプション
    3. Encoding.default_internal

    と幾つか方法はあるようだが、$KCODEと同じ感覚で使えるのはマジックコメントで指定する方法だろうか。
     #coding: euc-jp
     #coding: shift_jis
     #coding: utf-8



    (参考)
    Rubyist Magazine - Ruby M17N の設計と実装

    今、Ruby1.9.3を使って練習してます。

    C:\Users>ruby -v
    ruby 1.9.3p194 (2012-04-20) [i386-mingw32]



    Rubyスクリプトの先頭行で、文字コードを指定する場合、
    「#coding: shift_jis」
    という1行を入れれば、とりあえず文字化けを回避することができました。

    ●M17N(多言語化)対応が施されたRuby1.9での文字コード指定方法
    =グローバル変数「$KCODE」は使わない。
    =マジックコメント(XML宣言のencoding属性のようなもの)を使う。

    ●UTF-8とUTF-8N
    文字コードのUTF-8には、「BOM(バイト順マーク)」という付加情報(メタデータ)の有無によって、「UTF-8N」という亜種があります。
    UTF-8 - Wikipedia

    Windows環境でUTF-8をベースに使用する - 日本語と文字コード - Ruby入門

    文字コードをUTF-8で保存する場合、BOM(バイトオーダーマーク)付きにすると問題が発生します。UTF-8で保存する場合はBOM無しにして下さい。

    エラーを見て頂くと分かる通り1行目でエラーが発生していることになっています。UTF-8でBOMを付けた場合にはプログラムの先頭に3つのバイト「EF BB BF」が付きます。「EF BB BF」をそれぞれ8進数にした値が「357 273 277」です。Rubyはこの3つの文字を不正な値としてエラーにしているわけです。



    あれ~~~???
    今度は、見本のようなエラーメッセージが出なかったぞ!?

    ↓$KCODEを使わずに、マジックメソッドで文字コード「UTF-8」を指定したRubyスクリプト。

    #coding: utf-8
    require "kconv"
    print(Kconv.tosjis("表示する"))



    UTF-8Nで保存しても、UTF-8で保存しても、どっちも行けたYO☆
    文字コードの内部的な扱いは、ブラックボックスで見えてないけど、結果オーライということで、ここは華麗にスルーしておきますか。

    ググってみると、Rubyスクリプトは基本的に「UTF-8N」で保存すればOKみたいです。
    ほぅほぅじょせつ : UTF-8とUTF-8Nの違いによるワナ

    要するに、rubyコードもシェルスクリプトも「UTF-8N」で保存しなさいよっと。
    ただし、flashなどではBOM付きでないと不具合があるという話もあるので、使い分けが必要ですね。



    PHPスクリプトを保存するとき、UTF-8Nを使わないと、思わぬところでエラーが発生したから、Rubyでも要注意と。

    ●謝意
    Rubyを開発、提供してくれた方々に感謝します。
    Rubyに関する有益な情報、ソフトウェアを提供してくれた方々に感謝します。

    どうもありがとう(*ゝω・)ノ

    私が得た利益を、まだ得ていない方々にも還元したいです。
    さあ、このブログを見てしまった貴方も続いてください。

    Ruby made easy!!!
    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/805-ec37d763

    FC2Ad