我遇到了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
以下是我的文件的前三行:
;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en-lalalalallalalalalalalalaln Cell Generation
text/lalalalala1.0.0.1515
text/lalalala�DOG
当我运行这段代码时,它在读取文件的第三行(也就是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)
但是,如果我只运行以下内容的确定函数:
#!/bin/env ruby
#encoding: utf-8
def determine
type="text/lalalala�DOG".match(/DOG/)
puts(type)
end
它工作得非常完美。
那里出了什么问题? 提前感谢!
编辑: 文件中的第三行是:
text/lalalal»DOG
但是,当我在Ruby中打印文件的第三行时,它会显示为:
text/lalalala�DOG
编辑2:
这种格式也是为了支持本地化而开发的。文件中存储的字符串以2个字节的UNICODE字符形式存储。文件的格式是二进制文件,数据以网络位序(大端格式)存储。
irb
中时,它显示为"\U+FFEF\U+FFBF\U+FFBD"
。 - tadman»
,在UTF-8中它会被编码为字节[197, 187]
,而不是您得到的内容。您所拥有的可能是无效的。 - tadman