Ruby \xEF\xBF\xBD 乱码问题求救

hexawing · 2016年01月14日 · 最后由 hexawing 回复于 2016年01月15日 · 10126 次阅读

一个在 Windows 下生成的 txt 文件,我想在服务器端读取并解析之,服务器端自然是 Ubuntu 了,Rails=3.2.8,Ruby=1.9.3 然而

>> text = File.new("/home/terry/下载/客户编码.txt", 'a+')
#<File:/home/terry/下载/客户编码.txt>

>> text.readline
"{�ͻ�����}[�ָ���]\"~~\"\r\n"

>> text.binmode
#<File:/home/terry/下载/客户编码.txt>

>> text.readline
"// \xC3\xBF\xEF\xBF\xBD\xD0\xB8\xEF\xBF\xBD\xCA\xBD :\r\n"

查了下\xEF\xBF\xBD 就是著名的“锟斤拷”,然而网上好多都是只讲了下原理……所以我要怎么做呢 T_T

补充一下,在 Windows 下打开可以看到文件第一行是: {客户编码}[分隔符]"~~" 然而在 Ubuntu 下 (几乎) 用任何软件任何编码格式都无法正确预览,所以可能不只是 Ruby 的问题……

如果不懂,那么就试,,,给个可能解:

File.open('x.txt','a+:GBK:UTF-8'){ |f| p f.read }

#1 楼 @ceclachivo 谢谢回复。然而并不行……

>> File.open('/home/terry/下载/客户编码.txt','a+:GBK:UTF-8'){ |f| p f.read }
Encoding::InvalidByteSequenceError: "\xBD" followed by "\r" on GBK
    from (irb):43:in `read'
    from (irb):43:in `block in irb_binding'
    from (irb):43:in `open'
    from (irb):43
    from /home/terry/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands/console.rb:47:in `start'
    from /home/terry/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands/console.rb:8:in `start'
    from /home/terry/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.8/lib/rails/commands.rb:41:in `<top (required)>'
    from /home/terry/RubymineProjects/EIMV5/script/rails:6:in `require'
    from /home/terry/RubymineProjects/EIMV5/script/rails:6:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

能传个文件吗

#4 楼 @hexawing 公司访问不了,可以发个邮件到 [email protected]

#5 楼 @emayej 已发。请查收

应该是 windows 下的文本文件 BOM 问题

找个 editor 重新保存为非 BOM 头即可

#6 楼 @hexawing 文件已经坏了,里面存的就是乱码。用啥打开都一样。

按照你的想法,第一行: {客户编码}[分隔符]"~~"

你的文件第一行: \x7B\xEF\xBF\xBD\xCD\xBB\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\x7D\x5B\xEF\xBF\xBD\xD6\xB8\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\x5D\x22\x7E\x7E\x22

GB2312 编码的第一行: \x7B\xBF\xCD\xBB\xA7\xB1\xE0\xC2\xEB\x7D\x5B\xB7\xD6\xB8\xF4\xB7\xFB\x5D\x22\x7E\x7E\x22

UTF-8 编码的第一行: \x7B\xE5\xAE\xA2\xE6\x88\xB7\xE7\xBC\x96\xE7\xA0\x81\x7D\x5B\xE5\x88\x86\xE9\x9A\x94\xE7\xAC\xA6\x5D\x22\x7E\x7E\x22

#7 楼 @leiz_me 呃,是这样的,这个文件是另外一个财务软件导出出来的,我本来的想法是直接把导出的文件上传,后台解析之,就比较省事;如果要导出的财务人员再打开另存什么的,怕她们嫌麻烦,你知道财务连记事本都用得少,更别提 Notepad++ 什么的了。 关键还是那个二货财务软件只能导出 txt,但凡它能导个 excel 文件也强点啊……

#8 楼 @emayej 不对啊,我再在 Windows 下发一份给你看看,刚才那个是我在 Linux 下另存为的……但都是从邮箱里下载下来的,不应该如此啊………………

#10 楼 @hexawing 文件是 GB2312 编码的。那么问题应该是出在上传的时候,文件写坏了。

  1. 之前没有遇到过此类问题
  2. 结合一些资料来看,楼主网盘中的文件是使用 UTF-8 正确编码的文件,只是有很多 \xEF\xBF\xBD 字符罢了,是此文件本身的问题

质疑下题目出现的描述,麻烦确认清楚:

  1. 在 Windows 下打开可以看到文件第一行是,此处打开的文件是导出前的,还是导出后的。
  2. 确保能在 Windows 下打开导出后的文件,楼主最后亲自确认下,而不是通过别人口头告知;最好是用记事本是。
  3. 如果 导出后 的文件不能正确打开,那么这是财务软件或是编辑问题,跟 Ruby 无关。
  4. 如果 导出后 的文件能够正确打开,那么用十六进制编辑器打开看下字节流,与 Linux 下获取的文件的字节流对比下。
  5. 如果字节流一致,那就很怪异了。。。否则,就是传输的问题。

#11 楼 @emayej #12 楼 @ceclachivo 谢谢二位指点,问题好像已经解决了。 具体原因分析估计是这样的:同事在 Windows 下导出,然后发了邮件给我,我在 Ubuntu 下收的邮件,附件另存为,然后传到测试服务器。这时候文件其实已经损坏。 我后来试了下直接在 Windows 下传到测试服务器,读取就正常了

[1] pry(CustomerUnit)> File.open("#{name}",'r'){ |f| p f.read }
File.open("#{name}",'r'){ |f| p f.read }
"{\xBFͻ\xA7\xB1\xE0\xC2\xEB}[\xB7ָ\xF4\xB7\xFB]\"~~\"\r\n// ÿ\xD0и\xF1ʽ :\r\n// \xB1\xE0\xC2\xEB~~\xC3\xFB\xB3\xC6~~\xBC\xF2\xC2\xEB~~˰\xBA\xC5~~\xB5\xD8ַ\xB5绰~~\xD2\xF8\xD0\xD0\xD5˺\xC5~~\xD3ʼ\xFE\xB5\xD8ַ~~\xB1\xB8ע~~\xC9\xED\xB7\xDD֤У\xD1\xE9\r\n0001~~\xBD\xAD\xCE\xF7\xB7\xC9\xD0Ź\xE2\xCF˴\xAB\xB8\xD0\xC6\xF7\xBC\xFE\xD3\xD0\xCF\u07B9\xAB˾~~~~360802586558254~~\"\xBC\xAA\xB0\xB2\xCAм\xAA\xD6\xDD\xC7\xF8\xB9\xA4ҵ\u0530\xC4"#略
[2] pry(CustomerUnit)> File.open("#{name}",'r:GBK'){ |f| p f.read }
File.open("#{name}",'r:GBK'){ |f| p f.read }
"{客户编码}[分隔符]\"~~\"\r\n// 每行格式 :\r\n// 编码~~名称~~简码~~税号~~地址电话~~银行账号~~邮件地址~~备注~~身份证校验\r\n0001~~江西飞信光纤传感器件有限公司~~~~360802586558254~~\"吉安市吉州区工业园内 0796-8995142\"~~\"工行吉安市分"#略
需要 登录 后方可回复, 如果你还没有账号请 注册新账号