我对UTF-8 conding有些问题。我在这里阅读了一些帖子,但它仍然无法正常工作。
那是我的代码:
#!/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
这是我文件的前3行:
;?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)
BUT: 如果我只使用以下内容运行一个确定函数:
#!/bin/env ruby
#encoding: utf-8
def determine
type="text/lalalala�DOG".match(/DOG/)
puts(type)
end
效果很好。
那里出了什么问题? 提前谢谢!
编辑: 文件中的第三行是:
text/lalalal»DOG
但是当我在ruby中打印文件的thirf行时,它显示为:
text/lalalala�DOG
EDIT2:
此格式也是为了支持本地化而开发的。字符串存储 文件中存储为2个字节的UNICODE字符。格式为 该文件是一个二进制文件,其数据以网络字节顺序存储 (大端格式)。
答案 0 :(得分:3)
我相信@Amadan很接近,但却倒退了。我这样做:
File.open("/home/lala.txt", "r:ASCII-8BIT")
该字符无效UTF-8,但出于您的目的,看起来8位ASCII可以正常工作。我的理解是,当您使用字符串时,Ruby默认使用该编码,这就是为什么有用的原因。
更新:根据您最近的评论,听起来这就是您所需要的:
File.open("/home/lala.txt", "rb:UTF-16BE")
答案 1 :(得分:1)
尝试使用:
File.open("/home/lala.txt", "r:UTF-8")
在某个阶段使用错误的编码似乎存在问题。 #encoding :utf
仅指定源文件的编码,这会影响文字字符串的解释方式,并且对File.open
使用的编码没有影响。
答案 2 :(得分:-1)
简化文件数量较少的解决方案:
@Katja在某个文本编辑器中打开该文件,然后单击“另存为”选项并将其格式更改为UTF-8并单击“确定”。弹出窗口将显示以替换或创建新的。替换现有文件,您已开启。