使用Java中的Shift_JIS进行日文字符编码

时间:2015-04-21 01:29:46

标签: java shift-jis

我有一个使用tomcat提供的Web应用程序。

在其中一个页面上,它允许用户下载存储在我的文件服务器上的文件。这里出现的大多数文件的名称都是日文的。但是,当用户下载文件时,文件名称会出现乱码。此外,它在不同的浏览器上的工作方式也不同。

原始代码如下:

FileInputStream in = new FileInputStream(absolutePath);
ResponseUtil.download(new String(downloadFileName.getBytes("Shift_JIS"), "ISO-8859-1"), in);
例如,08_タイヨーアクリス_装置开発_実绩表被解释为
      08_ƒ^ƒCƒ-[ƒAƒNƒŠƒX_'•'uŠJ“-_ŽÀ-Ñ•Google Chrome中 此问题是由于文件名中存在“5c”,并且似乎是Shift_JIS中的已知问题。我想知道解决这个问题的正确方法。

2 个答案:

答案 0 :(得分:1)

看起来您正在使用的“Seasar sastruts”框架中的ResponseUtil.download方法正在使用您提供的文件名并将其直接粘贴在它构造的HTTP响应的Content-disposition标头中。< / p>

response.setHeader("Content-disposition", "attachment; filename=" + fileName + "\"");

据我所知,HTTP和MIME标头仅支持ASCII字符,因此该技术不适用于非ASCII字符。 (如果是这种情况,我认为这个类中的一个错误就是无条件地将文件名粘贴到标题中。)在传递字符串之前修改或尝试重新编码字符串将不起作用,因为这编码处于不同的水平。

要支持非ASCII字符,需要使用MIME encoded-word technique对标头值进行编码。没有办法使用ResponseUtil类,因为它将您直接提供的名称连接到非编码字符串。

我认为你需要重写download()方法来检查它接收的文件名输入中的非ASCII字符,并对包含它们的字符串使用编码字编码。你希望它看起来像这样,其中some_base64_text是编码为Shift-JIS的文件名字节的实际base-64编码。 (或者改用UTF-8。)

Content-disposition: =?Shift_JIS?B?some_base64_text?=

围绕这个可能存在很多不同的浏览器行为,因为他们正在尝试解决各种“错误”的Web服务器。但看起来像这样编码是一个很好的选择,让它工作并使其可移植。

答案 1 :(得分:1)

非常感谢。 我能够使用以下方法解决Chrome上的问题:

ResponseUtil.download(URLEncoder.encode(downloadFileName, "UTF-8"), in);

但是,在Firefox和Safari中,编码仍然不正确。

在Chrome中,该文件名为&#34; 08_タイヨーアクリス_装置开発_実绩表.pdf&#34; 但是,在Firefox和Safari上,它被命名为&#34; 08_%E3%82%BF%E3%82%A4%E3%83%A8%E3%83%BC%E3%82%A2%E3%82% AF%E3%83%AA%E3%82%B9_%E8%A3%85%E7%BD%AE%E9%96%8B%E7%99%BA_%E5%AE%9F%E7%B8%BE% E8%A1%A8.pdf&#34;