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"
百度半天没找到怎么解决这个乱码 (寻求帮助谢谢)
可以在问个问题吗 这句转码大部分都是好用的 但是 当文件名字有“申請”两字的时候会出问题 “申請”得到的是 "\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
调用去掉)
如果遇见有的 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 |