2

ARGF.set_encoding言います:

単一の引数が指定されている場合、ARGF から読み取られた文字列は、指定されたエンコーディングでタグ付けされます。

"ascii:utf-8" のようにコロンで区切られた 2 つのエンコーディング名が指定された場合、読み取られた文字列は最初のエンコーディング (外部エンコーディング) から 2 番目のエンコーディング (内部エンコーディング) に変換され、次に 2 番目のエンコーディングでタグ付けされます。

だから私は以下を試しました:

p RUBY_VERSION
p ARGF.external_encoding
ARGF.set_encoding('ascii')
p ARGF.readlines($/)

出力:

D:\Rubyscript\My ruby learning days>ruby true.rb a.txt
"2.0.0"
#<Encoding:IBM437>
["Hi! How are you?\n", "I am doing good,thanks."]

p RUBY_VERSION
p ARGF.external_encoding
ARGF.set_encoding(ARGF.external_encoding,'ascii')
p ARGF.readlines($/)

出力:

D:\Rubyscript\My ruby learning days>ruby true.rb a.txt
"2.0.0"
#<Encoding:IBM437>
["Hi! How are you?\n", "I am doing good,thanks."]

エンコーディングの変更はありません。ですから、正しいアプローチを教えてください。

4

1 に答える 1

5

エンコーディングIBM437and ASCII(およびUTF-8) の ASCII 文字のバイト シーケンスは同じです。したがって、 との違いはわかりませんString#inspectString#encodingただし、入力文字列の値を確認することはできます。

p RUBY_VERSION
p ARGF.external_encoding
ARGF.set_encoding(ARGF.external_encoding,'ascii')
p ARGF.readlines($/).map{|s| s.encoding}

Ruby ( 1.9 以降のバージョン) では、文字列は何らかのエンコーディングでタグ付けされたバイト シーケンスです。からエンコーディングを取得できますString#encoding

したがって、中国語の「中」はさまざまな方法で表すことができます。

e4 b8 ad          # tagged with encoding UTF-8
d6 d0             # tagged with encoding GBK
2d 4e             # tagged with encoding UTF-16le

スクリプトは常に UTF-8 で記述します。つまり、スクリプトの内部エンコーディングは UTF-8 です。GBK でエンコードされたテキスト ファイル (たとえば、"a.txt" という名前で "中" という内容のファイル) を処理したい場合があります。次に、IO オブジェクトの外部エンコーディングと内部エンコーディングを設定すると、Ruby が変換を行います。

ARGF.set_encoding('GBK', 'UTF-8')
str = ARGF.readline
puts str.encoding

# run             $ script.rb a.txt

Ruby"\xd6\xd0"は「a.txt」から読み取り、外部エンコーディングをGBKとして指定したため、エンコーディングGBKでデータにタグを付けます。また、内部エンコーディングを UTF-8 に指定しているため、Ruby は GBK バイト シーケンスから UTF-8 への変換を行い、結果として"\xe4\xb8\xad"タグが UTF-8 になります。この文字列はスクリプト内の他の文字列と同じエンコーディングなので、簡単に使用できます。

これは、2 つの String オペランドが異なる、互換性のないエンコーディングを持つ場合、多くの String メソッドが失敗するため便利です。例えば:

# encoding: utf-8
a = "中"                  # tagged with UTF-8
b = "中".encode('gbk')    # tagged with GBK
puts a + b
#=> Encoding::CompatibilityError: incompatible character encodings: UTF-8 and GBK
于 2013-03-27T19:19:01.250 に答える