ruby – 在字符串编码中猜测日志文件中的字节流

ruby – 在字符串编码中猜测日志文件中的字节流,第1张

概述tl; dr summary:给定一个字节流表示未知编码中的字符串,我应该尝试解码字节以及以什么顺序解释字节以获得找到“正确”编码的最佳机会? 问题的例子 我有一个我碰巧知道的文件arrows.txt已经使用UTF-8保存,单字符内容为⇈.如果我假装我不知道该文件的编码是什么,Windows上的以下Ruby代码将失败: s = IO.read('foo.txt')p s.encoding, tl; dr summary:给定一个字节流表示未知编码中的字符串,我应该尝试解码字节以及以什么顺序解释字节以获得找到“正确”编码的最佳机会?

@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 – 在字符串编码中猜测日志文件中的字节流所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1279021.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存