Ruby rubyZip 乱码问题

ly7524126 · 2018年10月26日 · 最后由 ly7524126 回复于 2018年11月02日 · 1056 次阅读
fin = "/home/test.zip"
    ::Zip::InputStream.open(fin, 0) do |fzip|
      while entry = fzip.get_next_entry
        p entry.name
      end
    end

zip 里面有个あたたかい.pdf 的 pdf

想获取这个 pdf 的名字用的 rubyzip 这个 gem

结果: "\x82\xA0\x82\xBD\x82\xBD\x82\xA9\x82\xA2.pdf"

百度半天没找到怎么解决这个乱码 (寻求帮助谢谢)

共收到 12 条回复

用 puts 输出, 别用 p, p 是调试用的

压缩后解压看一下是不是对的

iconv 转一下

p entry.name.encode(Encoding.default_external, "SJIS")

Zip 用的是本地字符集,乱码的话十有八九是用 ShiftJIS 编码的。

BruceDing 回复

文件是我自己创建的应该没问题

lululau 回复

好我去查查试一下 谢谢

lululau 回复

非常感谢 我是日文系统下打得 zip 用这个可以得到正确文件名

msg7086 回复

恩学习了 对是日文系统下压缩的 zip

lululau 回复

可以在问个问题吗 这句转码大部分都是好用的 但是 当文件名字有 “申請” 两字的时候会出问题 “申請” 得到的是 "\x90\/\x90\xBF"

"\x90/\x90\xBF".encode(Encoding.default_external, "SJIS")

结果 Encoding::InvalidByteSequenceError: "\x90" followed by "/" on Windows-31J

我解决办法

"\x90\\/\x90\xBF".encode(Encoding.default_external, "SJIS")

结果 "申/請 " 把 “/” 直接输出 不知道有什么解决办法!!!

“申請” 这两个字的 Shift JIS 编码中的第 2 个字节是 0x5C,对应到 ASCII/UTF-8 是反斜杠,而不是斜杠,我猜测这个 rubyzip 库可能是把这个反斜杠也当成了文件路径分隔符了吧。我在 Mac 上试了,没法创建出包含 “申請” 这个两个字的 SJIS 编码的文件名,所以也没法给你试一下。

你可以在你的解压代码前加上:

Zip.force_entry_names_encoding = 'SJIS'

试试行不行。(加上这句之后应该需要把之前加的 String#encode 调用去掉)

lululau 回复

好的 谢谢帮助 我再去试试

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册