如果指定了单个参数,则用指定的编码标记从ARGF读取的字符串。 如果给出两个由冒号分隔的编码名称,例如"ascii:utf-8",则读取字符串从第一编码(外部编码)转换为第二编码(内部编码),然后用第二编码进行标记。
所以我尝试了以下几点:
p RUBY_VERSION
p ARGF.external_encoding
ARGF.set_encoding('ascii')
p ARGF.readlines($/)产出:
D:\Rubyscript\My ruby learning days>ruby true.rb a.txt
"2.0.0"
#<Encoding:IBM437>
["Hi! How are you?\n", "I am doing good,thanks."]
p RUBY_VERSION
p ARGF.external_encoding
ARGF.set_encoding(ARGF.external_encoding,'ascii')
p ARGF.readlines($/)产出:
D:\Rubyscript\My ruby learning days>ruby true.rb a.txt
"2.0.0"
#<Encoding:IBM437>
["Hi! How are you?\n", "I am doing good,thanks."]没有找到编码更改。所以请告诉我正确的方法。
发布于 2013-03-27 19:19:01
IBM437和ASCII (和UTF-8)对ASCII字符的编码具有相同的字节序列。因此,您将不会看到与String#inspect的区别。但是,您可以检查输入字符串的String#encoding值。
p RUBY_VERSION
p ARGF.external_encoding
ARGF.set_encoding(ARGF.external_encoding,'ascii')
p ARGF.readlines($/).map{|s| s.encoding}在Ruby1.9和更高版本的中,字符串是一个带有某种编码标记的字节序列。您可以从String#encoding获得编码。
因此,中文单词"中“可以用不同的方式来表示:
e4 b8 ad # tagged with encoding UTF-8
d6 d0 # tagged with encoding GBK
2d 4e # tagged with encoding UTF-16le我总是用UTF-8编写我的脚本,也就是说,我的脚本的内部编码是UTF-8。有时,我希望处理文本文件(例如,名为"a.txt“并具有内容"中")。然后,我可以设置IO对象的外部编码和内部编码,Ruby将为我进行转换。
ARGF.set_encoding('GBK', 'UTF-8')
str = ARGF.readline
puts str.encoding
# run $ script.rb a.txtRuby从“"\xd6\xd0"”中读取a.txt,并且由于我已经将外部编码指定为GBK,所以它用编码GBK标记数据。我已经将内部编码指定为UTF-8,因此Ruby将GBK字节序列转换为UTF-8,这将导致标记UTF-8的"\xe4\xb8\xad"。这个字符串与我脚本中的其他字符串具有相同的编码方式,所以我可以轻松地使用它。
这很有用,因为当两个字符串操作数有不同的、不兼容的编码时,很多字符串方法都会失败。例如:
# encoding: utf-8
a = "中" # tagged with UTF-8
b = "中".encode('gbk') # tagged with GBK
puts a + b
#=> Encoding::CompatibilityError: incompatible character encodings: UTF-8 and GBKhttps://stackoverflow.com/questions/15666458
复制相似问题