Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中使用Shift_-JIS的日语字符编码_Java_Shift Jis - Fatal编程技术网

Java中使用Shift_-JIS的日语字符编码

Java中使用Shift_-JIS的日语字符编码,java,shift-jis,Java,Shift Jis,我有一个使用tomcat提供的web应用程序 在其中一个页面上,它允许用户下载存储在我的文件服务器上的文件。大多数文件的名字都是日文的。但是,当用户下载该文件时,该文件的名称被篡改。此外,它在不同浏览器上的工作方式也不同 原代码如下: FileInputStream in = new FileInputStream(absolutePath); ResponseUtil.download(new String(downloadFileName.getBytes("Shift_JIS"), "IS

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

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

原代码如下:

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

看起来像是从“Seasar sastruts”下载的
ResponseUtil.download
方法您正在使用的框架是获取您提供的文件名,并将其直接粘贴到它构造的HTTP响应的
内容处置
头中

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

据我所知,HTTP和MIME头只支持ASCII字符,所以这种技术不适用于非ASCII字符。(如果是这样的话,我会认为它是一个在这个类中的bug,它无条件地将文件名粘贴到标题中。)在传入字符串之前修改或尝试对其重新编码将无效,因为此编码处于不同的级别

要支持非ASCII字符,需要使用对标题值进行编码。无法使用
ResponseUtil
类进行编码,因为它将您直接提供的名称连接到非编码字字符串中

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

这可能有很多不同的浏览器行为,因为他们试图处理各种“错误”的web服务器。但这种编码方式似乎是让它工作并使其可移植的好办法。

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

ResponseUtil.download(URLEncoder.encode(downloadFileName, "UTF-8"), in);
但是,编码在Firefox和Safari中仍然不正确

在Chrome中,文件名为“08”_タイヨーアクリス_装置開発_実績表.pdf“
但是,在Firefox和Safari上,它被命名为“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_8%A3%85%E7%BD%E9%96%8B%E7%99%BA_9%E5%AE%E7%B8%BE%E8%A8%A8.pdf”.

第二行代码的目的是什么?它运行在什么上下文中?看起来代码采用Unicode格式的文件名,将其编码为Shift JIS,然后尝试解码Shift JIS数据,就像它是ISO-8859-1一样。这可能会使其混乱;这是一个字符编码错误。基本上,secon代码的d行将下载带有“downloadFileName”中存储的日文名称的文件。该文件是以乱码名称下载的。正确的方法是什么?这是因为这些字符串转换正在乱码。如果只执行
ResponseUtil.download(downloadFileName,in)会发生什么情况
?这段代码在哪里运行?它是在用户浏览器中运行的Java小程序吗?在Shift JIS中应该是什么?是文件的内容吗?还是它们运行的文件系统的名称本身就是Shift JIS?只是“ResponseUtil.downloadFileName,in)'还乱码文本。此代码在Servlet中运行。这不是内容,而是文件的名称。此外,乱码字符串对于不同的浏览器是不同的。明白了。听起来浏览器为ResponseUtil生成的HTTP响应选择了错误的编码,因为HTTP或HTML头指示wrong编码,或者浏览器正在使用猜测错误的试探法。或者您的输出被编码到错误的字符集。但这是一个错误的修复位置:它发生在处理管道的下游,整个响应文档被编码并呈现给用户。Java字符串只能保存Unicode;尝试重新编码这里只是增加了另一个错误。虽然我有点惊讶,在日本开发的框架会把事情搞砸。也许我在这里忽略了一些明显的东西。
ResponseUtil.download(URLEncoder.encode(downloadFileName, "UTF-8"), in);