Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 文字列.encoding / encode / force_encoding

文字列.encoding / encode / force_encoding

文字列のエンコーディング(文字コード)を確認・変換するメソッドです。日本語を扱う場合に特に重要です。

構文
# 文字列の現在のエンコーディングを返します。
文字列.encoding

# 指定したエンコーディングに変換した新しい文字列を返します。
文字列.encode(エンコーディング)
文字列.encode(変換先, 変換元)
文字列.encode(エンコーディング, invalid: :replace, undef: :replace)

# エンコーディング情報だけを変更します(バイト列は変換しません)。
文字列.force_encoding(エンコーディング)
メソッド一覧
メソッド概要
encoding文字列に設定されているエンコーディングを『Encoding』オブジェクトで返します。
encode(enc)指定したエンコーディングに変換した新しい文字列を返します。変換できない文字がある場合は例外が発生します。
encode(enc, invalid:, undef:)変換できない文字の処理方法をオプションで指定します。『:replace』を指定すると代替文字に置き換えます。
force_encoding(enc)バイト列を変換せずにエンコーディング情報のみを変更します。バイナリデータを扱う場合に使います。
encode!元の文字列を直接変更します(破壊的メソッド)。
サンプルコード
# 文字列のエンコーディングを確認します。
テキスト = "こんにちは"
puts テキスト.encoding  # UTF-8

# UTF-8 から Shift_JIS に変換します。
sjis = テキスト.encode("Shift_JIS")
puts sjis.encoding      # Shift_JIS

# 変換できない文字を置換文字で代替します。
特殊文字 = "Hello \u{1F600}"  # 絵文字を含む文字列
begin
  sjis = 特殊文字.encode("Shift_JIS")
rescue Encoding::UndefinedConversionError => e
  puts "変換エラー: #{e.message}"
end

# invalid/undef オプションで変換できない文字を除去します。
安全変換 = 特殊文字.encode(
  "Shift_JIS",
  invalid: :replace,
  undef: :replace,
  replace: "?"
)
puts 安全変換.encode("UTF-8")  # Hello ?

# force_encoding でエンコーディング情報だけ変更します。
バイト列 = "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd"
テキスト2 = バイト列.force_encoding("Shift_JIS")
puts テキスト2.encode("UTF-8")  # こんにちは
概要

Ruby 1.9以降では文字列がエンコーディング情報を持っており、異なるエンコーディングの文字列を混在させると『Encoding::CompatibilityError』が発生します。現代のRubyプログラムでは通常UTF-8を使用するため、エンコーディングを意識する機会は減りましたが、外部ファイルやAPIとのデータ連携では確認が必要です。

『encode』と『force_encoding』は動作が異なります。『encode』はバイト列を変換しますが、『force_encoding』はバイト列を変えずにRubyが文字列をどう解釈するかだけを変更します。誤った使い方をすると文字化けの原因になります。

文字列の型変換については『to_i / to_f / to_sym』を、文字列の長さ取得(バイト数)については『length / size / bytesize』を使用してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。