2010-11-25 78 views
0

如何处理非英文文件名与非英文文件名

问题是我的程序不能保证那些目录和文件名是英文的,如果一些文件名使用日文,中文字符,它会显示一些字符'?'。

任何人都可以建议我笏我需要做的访问非英语文件名

+0

哪种语言和平台是那种? – 2010-11-25 09:12:38

+4

你的问题到底是什么?你似乎在替换特殊字符,那么问题是什么? – 2010-11-25 09:21:24

+2

我会在这里钝。你还没有确切地说明你的程序在做什么以及它在哪里遇到麻烦。显示文件名有困难吗?如果是这样,它如何显示文件名?它是使用Spring,JSF,Wicket等的Swing应用程序或Web应用程序吗?从您提供的代码中,我只能推断出您正试图阻止显示“特殊”字符,如果您最终要处理ANSI或ISO-8859-1字符,则不应引起问题。 – 2010-11-25 12:20:47

回答

2

的Java本身使用Unicode - 你不需要更换特殊字符,为Unicode 无特殊字符 - 每一个代码点被平等对待。您的replaceSpChars()可能是这里的罪魁祸首。

3

问题是我的程序无法保证这些目录和文件名是英文的。如果一个文件名使用日文,中文字符将显示一些像'?'的字符。

问题很明显,“it”使用错误的字符集来显示文件名。解决方案取决于“它”是否是您的程序(通过GUI),某个其他应用程序,命令外壳程序/终端仿真程序还是用户的Web浏览器。如果你能提供更多信息,也许我可以提供一些建议。

但是将字符转换为下划线很可能是一个不好的解决方案。这很容易导致文件名冲突,并且这些中文/日文/等字符对于创建文件的人最有可能是有意义的。

顺便说一句,“英文”字母的正确术语是拉丁文。

编辑

为您的使用情况,您不要使用带有任何关系所提供的文件名的文件名保存PDF文件。我建议您尝试使用由(例如)currentTimeInMillis()生成的拉丁数字和字母组成的文件名来解决问题。如果失败了,那么你真正的问题根本与文件名无关。

EDIT 2

你问有关语句

if (fileName.startsWith("=?iso-8859")) 

这似乎是试图拆散的MIME encoded-word格式的文件名;请参阅RFC 2047 Section 2

首先,我认为代码可能是不必要的。 javadoc不是特定的,但我认为Part.getFilename()方法应该处理文件名的解码。

其次,如果解码是必要的,那么你就会以错误的方式去解决问题。字符集之后的内容不能简单地视为文件名的值。看看RFC。

三,如果您需要您应该使用相关的MimeUtility方法来解码“单词”标记......就像文件名。

第四,ISO-8859-1不适用于非拉丁字符集中的字符。

最后,检查电子邮件的原始邮件的标题,你试图解码,并寻找开始

Content-Disposition: attachment; filename=... 

如果文件名看起来像“=?ISO-8859-1的标题行? ..“,并且文件名应该包含日文/中文/等字符,那么问题出现在构建电子邮件的客户端(或其他)中。字符集需要是“utf-8”或其他多字节字符集之一。