ZIP文件路径含重音字符时MarkLogic XQuery应用无法读取文件问题求助
问题根因
Windows系统创建ZIP文件时,默认使用CP437(英文环境)或GBK(中文环境)编码存储文件路径/文件名,而非UTF-8。MarkLogic的zip处理模块默认采用UTF-8解码路径,编码不匹配就会导致重音、非ASCII字符乱码,你遇到的é被识别为U+201A字符就是典型的编码错位问题。
可行解决方案
方案1:调用zip接口时指定解码编码
MarkLogic 10的zip系列函数支持传入第三个参数指定编码,你读取清单、提取文件时都指定对应Windows编码即可:
- 读取ZIP清单示例:
(: 替换为你拿到的上传ZIP二进制内容 :) let $zip-bin := xdmp:document-get("upload.zip", ("format-binary")) return zip:list($zip-bin, "CP437")
- 提取指定文件示例:
let $zip-bin := xdmp:document-get("upload.zip", ("format-binary")) let $target-path := "Café/your-target-file.txt" (: 正确的带重音路径 :) return zip:get-entry($zip-bin, $target-path, "CP437")
如果是中文Windows环境制作的ZIP,把上面的CP437替换为GBK即可。
方案2:对已得到的乱码路径做反向转码
如果你已经拿到了乱码的路径清单,可以通过编码转换得到正确路径后再调用提取接口:
let $garbled-path := "Caf‚/your-target-file.txt" (: 你读到的带乱码的路径 :) let $correct-path := xdmp:decode(xdmp:encode($garbled-path, "UTF-8"), "CP437") return zip:get-entry($zip-bin, $correct-path, "CP437")
补充建议
如果可以调整上传规则,建议要求用户压缩ZIP时选择UTF-8编码存储文件名,从源头上避免多环境编码适配问题。
内容的提问来源于stack exchange,提问作者Neil Bradley
相关产品推荐
相关产品推荐

