Ruby 1.9.3-429 では、最終的に UTF-8 文字列に変換されるさまざまなエンコーディングでプレーン テキスト ファイルを解析しようとしています。ASCII 以外の文字は、UTF-8 としてエンコードされたファイルでは正常に機能しますが、UTF-8 以外のファイルでは問題が発生します。
簡単な例:
File.open(file) do |io|
io.set_encoding("#{charset.upcase}:#{Encoding::UTF_8}")
line, char = "", nil
until io.eof? || char == ?\n || char == ?\r
char = io.readchar
puts "Character #{char} has #{char.each_codepoint.count} codepoints"
puts "SLICE FAIL" unless char == char.slice(0,1)
line << char
end
line
end
áÁð
どちらのファイルも、適切にエンコードされた単一の文字列です。ファイルが正しくエンコードされていることを確認しました$ file -i <file_name>
UTF-8 ファイルを使用すると、次のように返されます。
Character á has 1 codepoints
Character Á has 1 codepoints
Character ð has 1 codepoints
ISO-8859-1 ファイルの場合:
Character á has 2 codepoints
SLICE FAIL
Character Á has 2 codepoints
SLICE FAIL
Character ð has 2 codepoints
SLICE FAIL
私がこれを解釈している方法はreadchar
、誤って変換されたエンコーディングを返しているため、スライスが誤って返される原因となっています。
この動作は正しいですか? または、ファイルの外部エンコーディングを間違って指定していますか? このプロセスを書き直したくないので、どこかで間違いを犯していることを願っています。このようにファイルを解析しているのには理由がありますが、それらは私の質問には関係ないと思います。内部および外部エンコーディングをオプションとして指定するとFile.open
、同じ結果が得られました。