为什么我得到不兼容的编码regexp匹配(UTF-8 regexp与IBM437字符串)

时间:2015-06-22 15:51:57

标签: ruby

DLVARScriptTesting.rb:175:in `sub!': incompatible encoding regexp match (UTF-8 regexp with IBM437 string) (Encoding::CompatibilityError)
    from DLVARScriptTesting.rb:175:in `block in parse_file'
    from DLVARScriptTesting.rb:171:in `each'
    from DLVARScriptTesting.rb:171:in `each_with_index'
    from DLVARScriptTesting.rb:171:in `parse_file'
    from DLVARScriptTesting.rb:371:in `<main>'

这是完整的错误。

以下是第171和第171行。 175

File.readlines(testfile).each_with_index do |line, line_num|

    line.sub!(/^\xEF\xBB\xBF/, '') if line_num == 0

我已经尝试将编码设置为utf-8,但这不起作用 基本上代码试图做的是在字符串之前删除xEF xBB xBF(如果它在那里)。

1 个答案:

答案 0 :(得分:1)

  

...基本上代码试图做的是在字符串之前删除xEF xBB xBF(如果它在那里)。

为什么不忽略正则表达式并使用子字符串匹配和子字符串切片?像这个未经测试的代码:

line[0, 3] = '' if line[0, 3] == "\xef\xbb\xbf"

正则表达式很有用,但它们几乎不能替代字符串切片和切块。并且,如果引擎混淆并且必须进行大量回溯,它们可能导致代码严重减速。因此,在适当的时候使用它们并使用BenchmarkFruity来测试使用常规字符串处理对等效操作使用正则表达式。

另外,作为可扩展性的事情,不要这样做:

File.readlines(testfile).each_with_index

readlines将整个文件读入内存并将其转换为数组。如果您的代码从开发代码转移到生产代码并且正在读取的文件突然从1K变为500MB,会发生什么?当Ruby试图篡改文件然后将其转换为内存中的数组时,你会看到一个重大的减速。在我的世界中,500MB是小型的,多GB的文件是常态。

相反,使用foreach,如File.foreach(test file).with_index或更好,不要打扰each_with_indexwith_index,而是看$.这是foreach正在读取的文件的当前行号。 list.OrderByDescending(x => dictionary[x.id]) 逐行读取文件,即just as fast or faster than slurping a file