
@H_419_8@
问题的例子@H_419_8@
我有一个我碰巧知道的文件arrows.txt已经使用UTF-8保存,单字符内容为⇈.如果我假装我不知道该文件的编码是什么,Windows上的以下Ruby代码将失败:@H_419_8@
@H_419_8@
s = IO.read('foo.txt')p s.enCoding,#=> #<EnCoding:IBM437> s.valID_enCoding?,#=> true s.chars.to_a #=> ["\xE2","\x87","\x88"] 它’失败’因为它告诉我文件实际上有内容Γçê,并且一切都很好(编码是有效的).@H_419_8@
真实世界情景@H_419_8@
我有Nginx个日志文件和Akamai日志文件,这些文件对于他们记录的查询没有任何特定的编码,我需要以UTF-8的形式处理和存储数据库中的数据.大多数时候将每行解释为UTF-8会生成一个带有有效编码的字符串,但有时却不会.@H_419_8@
我想要求Ruby为每一行尝试各种编码,找到一个有效且可能(但当然不能保证)正确的编码.@H_419_8@
尝试失败@H_419_8@
我原来写了以下代码:@H_419_8@
@H_419_8@
def guess_enCoding( str,result='utf-8',*enCodings ) # Try every enCoding if none were passed in enCodings = EnCoding.List if enCodings.empty? # Keep forcing a new enCoding until we find one that is valID unless enCodings.find{ |e| str.force_enCoding(e) && str.valID_enCoding? } raise "None of the supplIEd enCodings was valID" end # Convert from the valID enCoding to the desired,replacing 'bad' characters str.encode(result,invalID: :replace,undef: :replace)end 这个问题是EnCoding.List中的第一个编码是ASCII-8BIT,它对所有字节流都有效.因此,如果我使用上面的代码并调用s2 = guess_enCoding(s),结果就是上面我的三字节双箭头字符的字符串 .@H_419_8@
最后,问题@H_419_8@
我应该以什么顺序测试编码以提供第一次valID_enCoding的最大机会?是正确的吗?哪些常见的编码是最常用的字节,所以我应该首先尝试它们,哪些常见的编码是完全允许的,这样我应该最后尝试?@H_419_8@
我是否应该使用其他启发式方法来猜测正确性? (如果特定编码导致的字符数少于另一个,那么它更可能是正确的吗?)@H_419_8@解决方法 你可以尝试 rchardet19宝石.它“在未知字符编码中采用一系列字节,并尝试确定编码.”它还为您返回的编码提供置信度分数.它过去曾为我工作过好几次,看起来就像你想要完成的那样.
@H_419_8@
用法示例:@H_419_8@
@H_419_8@
require 'rchardet19'cd = CharDet.detect("some data")# => #<struct #<Class:0x102216198> enCoding="ascii",confIDence=1.0> 总结 以上是内存溢出为你收集整理的ruby – 在字符串编码中猜测日志文件中的字节流全部内容,希望文章能够帮你解决ruby – 在字符串编码中猜测日志文件中的字节流所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)