一个在 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 的问题……
#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>'
#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
质疑下题目出现的描述,麻烦确认清楚:
#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\"~~\"工行吉安市分"#略