Ruby 更改字符编码

Ruby 更改字符编码,ruby,character-encoding,Ruby,Character Encoding,我在Ruby 1.9.2p290中更改文本文件的编码时遇到问题。我在UTF-8(ArgumentError)中得到错误无效字节序列。问题(我认为)在于,字符集似乎是未知的 如果执行以下操作,请从命令行: $ file test.txt 我得到: Non-ISO extended-ASCII English text, with CRLF line terminators test.txt: text/plain; charset=unknown UTF-8 false 或者,如果我这样做

我在Ruby 1.9.2p290中更改文本文件的编码时遇到问题。我在UTF-8(ArgumentError)中得到错误无效字节序列。问题(我认为)在于,字符集似乎是未知的

如果执行以下操作,请从命令行:

$ file test.txt
我得到:

Non-ISO extended-ASCII English text, with CRLF line terminators
test.txt: text/plain; charset=unknown
UTF-8
false
或者,如果我这样做:

$ file -i test.txt 
我得到:

Non-ISO extended-ASCII English text, with CRLF line terminators
test.txt: text/plain; charset=unknown
UTF-8
false
但是,在Ruby中,如果我这样做:

data = File.open("test.txt").read

puts data.encoding.name

puts data.valid_encoding?
我得到:

Non-ISO extended-ASCII English text, with CRLF line terminators
test.txt: text/plain; charset=unknown
UTF-8
false
下面是我的代码的简化片段:

data = File.open("test.txt").read

data.encode!("UTF-8")

data.each_line do |line|

  newfile_data << line

end
data=File.open(“test.txt”).read
数据编码!(“UTF-8”)
data.u每行do |行|

ruby 1.9中的newfile_data每个流都有2个与之相关的编码-外部编码和内部编码。 外部编码是对从流中读取的文本进行编码(在您的例子中,这是对文件的编码)。内部编码是从文件中读取的文本所需的编码

如果未为流设置外部/内部编码,则将使用流程的默认外部/内部编码。如果未指定内部编码,则从流中读取的字符串将使用外部编码(与
string.force_encoding
相同)进行标记(未转换)

很可能你有

Encoding::default_external # => Encoding:UTF-8
Encoding::default_internal # => nil
您的文件是用基于ASCII的标准字符编码,而不是UTF-8编码的。 您的Ruby代码将字节序列从外部源读取到UTF-8字符串中。由于您的字符串包含
非ISO扩展ASCII英文文本
,因此您得到的是
数据。有效编码?#=>错误

您需要将流的外部编码设置为文件的编码。例如,如果您的文件采用cp 1251编码,并使用文本
фаааа
,则需要使用以下代码读取:

data = File.open("test.txt", 'r:windows-1251').read    
puts data.encoding.name    # => windows-1251
puts data.valid_encoding?  # => true
甚至可以指定内部和外部编码:

data = File.open("test.txt", 'r:windows-1251:utf-8').read    
puts data.encoding.name    # => utf-8
puts data.valid_encoding?  # => true

该文件是否包含任何奇特的字符?您是如何创建该文件的/它保存为什么?