Ruby rubyZip 乱码问题

ly7524126 · 2018年10月26日 · 最后由 EvanYa 回复于 2021年10月13日 · 1582 次阅读
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"

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

用 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 回复

好的 谢谢帮助 我再去试试

如果遇见有的 zip 是在 windows 上打包, 有的是在 linux 打包可以以通过捕捉异常的方式同时兼容

Zip::File.open(fin) do |zip_file|
  zip_file.each do |entry|
    begin
      puts entry.name.encode(Encoding.default_external, "SJIS")
    rescue Encoding::InvalidByteSequenceError
      puts entry.name
    end
  end
end

具体解压可以通过以下方式测试

unzip -O SJIS /home/test.zip
unzip -O cp-932 /home/test.zip
No. 页面编码 名称 代码
1 37 IBM EBCDIC (美国 - 加拿大) IBM037
2 437 OEM 美国 IBM437
3 500 IBM EBCDIC (国际) IBM500
4 708 阿拉伯字符 (ASMO-708) ASMO-708
5 720 阿拉伯字符 (DOS) DOS-720
6 737 希腊字符 (DOS) ibm737
7 775 波罗的海字符 (DOS) ibm775
8 850 西欧字符 (DOS) ibm850
9 852 中欧字符 (DOS) ibm852
10 855 OEM 西里尔语 IBM855
11 857 土耳其字符 (DOS) ibm857
12 858 OEM 多语言拉丁语 I IBM00858
13 860 葡萄牙语 (DOS) IBM860
14 861 冰岛语 (DOS) ibm861
15 862 希伯来字符 (DOS) DOS-862
16 863 加拿大法语 (DOS) IBM863
17 864 阿拉伯字符 (864) IBM864
18 865 北欧字符 (DOS) IBM865
19 866 西里尔字符 (DOS) cp866
20 869 现代希腊字符 (DOS) ibm869
21 870 IBM EBCDIC (多语言拉丁语 2) IBM870
22 874 泰语 (Windows) windows-874
23 875 IBM EBCDIC (现代希腊语) cp875
24 932 日语 (Shift-JIS) shift_jis
25 936 简体中文 (GB2312) gb2312
26 949 朝鲜语 ks_c_5601-1987
27 950 繁体中文 (Big5) big5
28 1026 IBM EBCDIC (土耳其拉丁语 5) IBM1026
29 1047 IBM 拉丁语 1 IBM01047
30 1140 IBM EBCDIC (美国 - 加拿大 - 欧洲) IBM01140
31 1141 IBM EBCDIC (德国 - 欧洲) IBM01141
32 1142 IBM EBCDIC (丹麦 - 挪威 - 欧洲) IBM01142
33 1143 IBM EBCDIC (芬兰 - 瑞典 - 欧洲) IBM01143
34 1144 IBM EBCDIC (意大利 - 欧洲) IBM01144
35 1145 IBM EBCDIC (西班牙 - 欧洲) IBM01145
36 1146 IBM EBCDIC (英国 - 欧洲) IBM01146
37 1147 IBM EBCDIC (法国 - 欧洲) IBM01147
38 1148 IBM EBCDIC (国际 - 欧洲) IBM01148
39 1149 IBM EBCDIC (冰岛语 - 欧洲) IBM01149
40 1200 Unicode utf-16
41 1201 Unicode (Big-Endian) utf-16BE
42 1250 中欧字符 (Windows) windows-1250
43 1251 西里尔字符 (Windows) windows-1251
44 1252 西欧字符 (Windows) Windows-1252
45 1253 希腊字符 (Windows) windows-1253
46 1254 土耳其字符 (Windows) windows-1254
47 1255 希伯来字符 (Windows) windows-1255
48 1256 阿拉伯字符 (Windows) windows-1256
49 1257 波罗的海字符 (Windows) windows-1257
50 1258 越南字符 (Windows) windows-1258
51 1361 朝鲜语 (Johab) Johab
52 10000 西欧字符 (Mac) macintosh
53 10001 日语 (Mac) x-mac-japanese
54 10002 繁体中文 (Mac) x-mac-chinesetrad
55 10003 朝鲜语 (Mac) x-mac-korean
56 10004 阿拉伯字符 (Mac) x-mac-arabic
57 10005 希伯来字符 (Mac) x-mac-hebrew
58 10006 希腊字符 (Mac) x-mac-greek
59 10007 西里尔字符 (Mac) x-mac-cyrillic
60 10008 简体中文 (Mac) x-mac-chinesesimp
61 10010 罗马尼亚语 (Mac) x-mac-romanian
62 10017 乌克兰语 (Mac) x-mac-ukrainian
63 10021 泰语 (Mac) x-mac-thai
64 10029 中欧字符 (Mac) x-mac-ce
65 10079 冰岛语 (Mac) x-mac-icelandic
66 10081 土耳其字符 (Mac) x-mac-turkish
67 10082 克罗地亚语 (Mac) x-mac-croatian
68 12000 Unicode (UTF-32) utf-32
69 12001 Unicode (UTF-32 Big-Endian) utf-32BE
70 20000 繁体中文 (CNS) x-Chinese-CNS
71 20001 TCA 中国台湾 x-cp20001
72 20002 繁体中文 (Eten) x-Chinese-Eten
73 20003 IBM5550 中国台湾 x-cp20003
74 20004 TeleText 中国台湾 x-cp20004
75 20005 Wang 中国台湾 x-cp20005
76 20105 西欧字符 (IA5) x-IA5
77 20106 德语 (IA5) x-IA5-German
78 20107 瑞典语 (IA5) x-IA5-Swedish
79 20108 挪威语 (IA5) x-IA5-Norwegian
80 20127 US-ASCII us-ascii
81 20261 T.61 x-cp20261
82 20269 ISO-6937 x-cp20269
83 20273 IBM EBCDIC (德国) IBM273
84 20277 IBM EBCDIC (丹麦 - 挪威) IBM277
85 20278 IBM EBCDIC (芬兰 - 瑞典) IBM278
86 20280 IBM EBCDIC (意大利) IBM280
87 20284 IBM EBCDIC (西班牙) IBM284
88 20285 IBM EBCDIC (UK) IBM285
89 20290 IBM EBCDIC (日语片假名) IBM290
90 20297 IBM EBCDIC (法国) IBM297
91 20420 IBM EBCDIC (阿拉伯语) IBM420
92 20423 IBM EBCDIC (希腊语) IBM423
93 20424 IBM EBCDIC (希伯来语) IBM424
94 20833 IBM EBCDIC (朝鲜语扩展) x-EBCDIC-KoreanExtended
95 20838 IBM EBCDIC (泰语) IBM-Thai
96 20866 西里尔字符 (KOI8-R) koi8-r
97 20871 IBM EBCDIC (冰岛语) IBM871
98 20880 IBM EBCDIC (西里尔俄语) IBM880
99 20905 IBM EBCDIC (土耳其语) IBM905
100 20924 IBM 拉丁语 1 IBM00924
101 20932 日语 (JIS 0208-1990 和 0212-1990) EUC-JP
102 20936 简体中文 (GB2312-80) x-cp20936
103 20949 朝鲜语 Wansung x-cp20949
104 21025 IBM EBCDIC (西里尔塞尔维亚 - 保加利亚语) cp1025
105 21866 西里尔字符 (KOI8-U) koi8-u
106 28591 西欧字符 (ISO) iso-8859-1
107 28592 中欧字符 (ISO) iso-8859-2
108 28593 拉丁语 3 (ISO) iso-8859-3
109 28594 波罗的海字符 (ISO) iso-8859-4
110 28595 西里尔字符 (ISO) iso-8859-5
111 28596 阿拉伯字符 (ISO) iso-8859-6
112 28597 希腊字符 (ISO) iso-8859-7
113 28598 希伯来字符 (ISO-Visual) iso-8859-8
114 28599 土耳其字符 (ISO) iso-8859-9
115 28603 爱沙尼亚语 (ISO) iso-8859-13
116 28605 拉丁语 9 (ISO) iso-8859-15
117 29001 欧罗巴 x-Europa
118 38598 希伯来字符 (ISO-Logical) iso-8859-8-i
119 50220 日语 (JIS) iso-2022-jp
120 50221 日语 (JIS-允许 1 字节假名) csISO2022JP
121 50222 日语 (JIS-允许 1 字节假名 - SO/SI) iso-2022-jp
122 50225 朝鲜语 (ISO) iso-2022-kr
123 50227 简体中文 (ISO-2022) x-cp50227
124 51932 日语 (EUC) euc-jp
125 51936 简体中文 (EUC) EUC-CN
126 51949 朝鲜语 (EUC) euc-kr
127 52936 简体中文 (HZ) hz-gb-2312
128 54936 简体中文 (GB18030) GB18030
129 57002 ISCII 梵文 x-iscii-de
130 57003 ISCII 孟加拉语 x-iscii-be
131 57004 ISCII 泰米尔语 x-iscii-ta
132 57005 ISCII 泰卢固语 x-iscii-te
133 57006 ISCII 阿萨姆语 x-iscii-as
134 57007 ISCII 奥里雅语 x-iscii-or
135 57008 ISCII 卡纳达语 x-iscii-ka
136 57009 ISCII 马拉雅拉姆语 x-iscii-ma
137 57010 ISCII 古吉拉特语 x-iscii-gu
138 57011 ISCII 旁遮普语 x-iscii-pa
139 65000 Unicode (UTF-7) utf-7
140 65001 Unicode (UTF-8) utf-8
需要 登录 后方可回复, 如果你还没有账号请 注册新账号