我在生产环境的某个地方有一个我没有访问它的文件,当由 ruby 脚本加载时,针对内容的正则表达式失败并返回 ArgumentError => invalid UTF-8 中的字节序列
。
我相信我有一个基于这里所有要点的答案的修复:ruby 1.9: invalid byte sequence in UTF-8
# Remove all invalid and undefined characters in the given string
# (ruby 1.9.3)
def safe_str str
# edited based on matt's comment (thanks matt)
s = str.encode('utf-16', 'utf-8', invalid: :replace, undef: :replace, replace: '')
s.encode!('utf-8', 'utf-16')
end
但是,我现在想构建我的 rspec 来验证代码是否有效。我无权访问导致问题的文件,因此我想以编程方式创建一个编码错误的字符串。
我已经尝试过类似的变体:
bad_str = (100..1000).to_a.inject('') {|s,c| s << c; s}
bad_str.length.should > safe_str(bad_str).length
或者,
bad_str = (100..1000).to_a.pack(c*)
bad_str.length.should > safe_str(bad_str).length
但是长度总是一样的。我也尝试过不同的字符范围;并不总是 100 到 1000。
关于如何在 ruby 1.9.3 脚本中构建具有无效编码的字符串有什么建议吗?
最佳答案
大量单字节字符串将构成无效的 UTF-8 字符串,从 0x80 开始。所以 128.chr
应该可以工作。
关于ruby - 如何在 ruby 中创建一个带有 "bad encoding"的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18235301/