言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Ruby辞典

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

文字列.encoding / encode / force_encoding

対応: Ruby 1.9(2007)

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

構文

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

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

# エンコーディング情報だけを変更します(バイト列は変換しません)。
文字列.force_encoding(エンコーディング)

メソッド一覧

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

サンプルコード

sample_string_encoding_encode.rb
# 文字列のエンコーディングを確認します。
text = "こんにちは"
puts text.encoding  # UTF-8

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

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

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

# force_encoding でエンコーディング情報だけ変更します。
# 『\x82\xb1』のような表記は文字を16進数のバイト値で表したものです。
bytes = "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd"
text2 = bytes.force_encoding("Shift_JIS")
puts text2.encode("UTF-8")  # こんにちは
ruby string_encoding_encode.rb
UTF-8
Shift_JIS
変換エラー: U+1F600 from UTF-8 to Shift_JIS
Hello ?
こんにちは

概要

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』を使用してください。

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