Ruby 更改字符编码
我在Ruby 1.9.2p290中更改文本文件的编码时遇到问题。我在UTF-8(ArgumentError)中得到错误无效字节序列。问题(我认为)在于,字符集似乎是未知的 如果执行以下操作,请从命令行: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 或者,如果我这样做
$ 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
该文件是否包含任何奇特的字符?您是如何创建该文件的/它保存为什么?