Ruby rubyZip 乱码问题

ly7524126 · 2018年10月26日 · 最后由 ly7524126 回复于 2018年11月02日 · 954 次阅读
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 回复

好的 谢谢帮助 我再去试试

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