6

我对 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

那是我文件的前 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)

但是:如果我只运行具有以下内容的确定函数:

#!/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 字符。文件的格式是二进制文件,数据以网络字节顺序(大端格式)存储。

4

3 回答 3

3

我相信@Amadan 很接近,但它倒退了。我会这样做:

File.open("/home/lala.txt", "r:ASCII-8BIT")

该字符不是有效的 UTF-8,但出于您的目的,看起来 8 位 ASCII 可以正常工作。我的理解是,当您只使用字符串时,Ruby 默认使用该编码,这就是它起作用的原因。

更新:根据您最近的评论,听起来这就是您需要的:

File.open("/home/lala.txt", "rb:UTF-16BE")
于 2013-03-14T03:14:37.953 回答
1

尝试使用这个:

File.open("/home/lala.txt", "r:UTF-8")

在某个阶段使用错误的编码似乎存在问题。#encoding :utf仅指定源文件的编码,这会影响文字字符串的解释方式,并且对File.open使用的编码没有影响。

于 2013-03-14T02:52:44.847 回答
-1

文件数量较少的简单解决方案:

@Katja 在一些文本编辑器中打开文件,然后单击另存为选项并将其格式更改为 UTF-8,然后单击确定。将显示弹出窗口以替换或创建新的。替换现有文件即可。

于 2013-05-20T13:26:49.737 回答