6

UTF-8のコーディングに問題があります。私はここでいくつかの投稿を読みましたが、それでもどういうわけか正しく機能しません。

それが私のコードです:

#!/bin/env ruby
#encoding: utf-8

def determine
  file=File.open("/home/lala.txt")          
  file.each do |line|           
    puts(line)
    type = line.match(/DOG/)
    puts('aaaaa')

    if type != nil 
      puts(type[0])
      break
    end        

  end
end

それが私のファイルの最初の3行です:

;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en-lalalalallalalalalalalalaln Cell Generation
text/lalalalala1.0.0.1515
text/lalalala�DOG

このコードを実行すると、ファイルの3行目(dogという単語が立っている場所)を読み取るときにエラーが表示されます。

;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en-lalalalallalalalalalalalaln Cell Generation
aaaaa

text/lalalalala1.0.0.1515
aaaaa

text/lalalala�DOG
/home/kik/Desktop/determine2.rb:16:in `match': invalid byte sequence in UTF-8 (ArgumentError)

しかし、私がaaを実行した場合、次の内容の関数を決定します。

#!/bin/env ruby
#encoding: utf-8

    def determine
    type="text/lalalala�DOG".match(/DOG/)
    puts(type)
end

それは完璧に動作します。

そこで何が問題になっていますか?前もって感謝します!

編集:ファイルの3行目は次のとおりです。

text/lalalal»DOG

しかし、ファイルの3行目をルビーで印刷すると、次のように表示されます。

text/lalalala�DOG

EDIT2:

このフォーマットは、ローカリゼーションをサポートするためにも開発されました。ファイル内に保存されている文字列は、2バイトのUNICODE文字として保存されます。ファイルの形式は、データがネットワークバイトオーダー(ビッグエンディアン形式)で保存されているバイナリファイルです。

4

3 に答える 3

3

@Amadanは近いと思いますが、後ろ向きです。私はこれをします:

File.open("/home/lala.txt", "r:ASCII-8BIT")

文字は有効な UTF-8 ではありませんが、目的のためには、8 ビット ASCII が正常に機能するようです。私の理解では、文字列を使用するだけの場合、Rubyはデフォルトでそのエンコーディングを使用しているため、それが機能します。

更新:あなたの最新のコメントに基づいて、これが必要なもののように思えます:

File.open("/home/lala.txt", "rb:UTF-16BE")
于 2013-03-14T03:14:37.953 に答える
1

これを使用してみてください:

File.open("/home/lala.txt", "r:UTF-8")

ある段階で間違ったエンコーディングが使用されているという問題があるようです。#encoding :utfソース ファイルのエンコーディングのみを指定します。これはリテラル文字列の解釈方法に影響し、File.open使用するエンコーディングには影響しません。

于 2013-03-14T02:52:44.847 に答える