Skip to content

Instantly share code, notes, and snippets.

@okkez
Created May 20, 2011 03:12
Show Gist options
  • Save okkez/982278 to your computer and use it in GitHub Desktop.
Save okkez/982278 to your computer and use it in GitHub Desktop.

Revisions

  1. okkez created this gist May 20, 2011.
    34 changes: 34 additions & 0 deletions encoding.markdown
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    # Ruby Encoding Cheat Sheet

    1. BINARY な文字列を使うときだけ `force_encoding` しなさい。
    2. ネットワークかファイルシステムから BINARY な文字列を受け取ったとき
    は、確実に正しいエンコーディングに `force_encode` しなさい。
    * 一般的に、HTTP における Content-Type ヘッダのようなもので
    ネットワークから受け取った BINARY な文字列のエンコーディング
    情報は与えられている。
    * エンーコーディングがわからないときは、その文字列はずっと
    BINARY で扱いなさい。BINARY でない文字列との結合なんてし
    てはいけない。
    3. BINARY な文字列に `force_encoding` を呼び出したときは、直後に
    `encode!` を呼び出します。これはその文字列を `default_internal`
    エンコーディングに変換します。
    4. 正規表現で u オプションを使うときは、確実にユニコードな文字列だけを扱いなさい。
    5. 正規表現で n オプションを使うときは、確実に BINARY な文字列だけを扱いなさい。
    6. BINARY (ASCII-8BIT) ともう一つ互換性のないエンコーディングを受け取った場合、
    正しいデバッグのアプローチは、BINARY 文字列がどこから来たか特定することです。
    これは、ライブラリが BINARY データをネットワークから読み込んだが、エンコー
    ディング情報が与えられていないことを意味します。
    7. アプリケーションコードでは、* 絶対に * BINARY データを特定のエンコーディングに
    変換するために `force_encoding` を使ってはいけない。アプリケーションコードに
    辿り着いた時点で、どのエンコーディングが使われていたのかという情報を失っている。
    代わりにその文字列が Ruby に入ってきた場所を見つけて、そのデータが持っている情報
    に基いて正しいエンコーディングをセットするように修正してください。
    8. ライブラリのコードでは、どのエンコーディングが使われているかわかっている BINARY
    データをあるエンコーディングに変換するためだけに `force_encoding` を使用してください。
    これはネットワークプロトコルのヘッダがある場合や、マジックコメントが ERB の
    テンプレートファイルやソースコードで使われている場合です。
    9. マジックコメントをソースファイルに含めるのは、実際にその
    エンコーディングの文字列をそのソースファイルに含む場合だけです。
    10. 二つの相異なるエンコーディングを持つ文字列を結合するには、
    `encode` メソッドを使って二つの文字列のエンコーディングを
    揃えてから結合します。