0

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、同じ結果が得られました。

4

1 に答える 1