首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与ARGF#set_encoding混淆

问与ARGF#set_encoding混淆
EN

Stack Overflow用户
提问于 2013-03-27 18:19:51
回答 1查看 309关注 0票数 2

ARGF.set_encoding说:

如果指定了单个参数,则用指定的编码标记从ARGF读取的字符串。 如果给出两个由冒号分隔的编码名称,例如"ascii:utf-8",则读取字符串从第一编码(外部编码)转换为第二编码(内部编码),然后用第二编码进行标记。

所以我尝试了以下几点:

代码语言:javascript
复制
p RUBY_VERSION
p ARGF.external_encoding
ARGF.set_encoding('ascii')
p ARGF.readlines($/)

产出:

代码语言:javascript
复制
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($/)

产出:

代码语言:javascript
复制
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."]

没有找到编码更改。所以请告诉我正确的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-27 19:19:01

IBM437和ASCII (和UTF-8)对ASCII字符的编码具有相同的字节序列。因此,您将不会看到与String#inspect的区别。但是,您可以检查输入字符串的String#encoding值。

代码语言:javascript
复制
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获得编码。

因此,中文单词"中“可以用不同的方式来表示:

代码语言:javascript
复制
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将为我进行转换。

代码语言:javascript
复制
ARGF.set_encoding('GBK', 'UTF-8')
str = ARGF.readline
puts str.encoding

# run             $ script.rb a.txt

Ruby从“"\xd6\xd0"”中读取a.txt,并且由于我已经将外部编码指定为GBK,所以它用编码GBK标记数据。我已经将内部编码指定为UTF-8,因此Ruby将GBK字节序列转换为UTF-8,这将导致标记UTF-8的"\xe4\xb8\xad"。这个字符串与我脚本中的其他字符串具有相同的编码方式,所以我可以轻松地使用它。

这很有用,因为当两个字符串操作数有不同的、不兼容的编码时,很多字符串方法都会失败。例如:

代码语言:javascript
复制
# 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 GBK
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15666458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档