我们在Linux服务器上运行Java Web应用程序,默认语言环境为“POSIX”。 我们的一些客户端上传文件名中包含非ascii字符的文件。 我们可以通过unicode在Java中保留那些非ascii字符,但是在我们将上传的文件保存到文件系统之后它们会丢失(保存的文件名将包含许多问号),因为文件系统的默认语言环境不支持非ascii字符。 在使用Java保存文件之前,有没有办法为文件名(而不是内容)指定字符集?
答案 0 :(得分:3)
可移植Java API没有文件系统字符编码的概念,因为它不可移植:Windows,例如:无论语言环境如何,都将文件名保存为unicode。但是,在Linux上,语言环境的LC_CTYPE
方面决定了文件系统的编码。因此,通过在 之前导出LC_CTYPE=en_US.utf8
或类似环境启动Java应用程序,您的应用程序将使用它来处理文件名。
另请参阅file.encoding has no effect, LC_ALL environment variable does it,其中讨论了此转换背后的一些内幕。
答案 1 :(得分:0)
如果文件完全在您的应用程序的控制之下,而不是上传到另一个应用程序使用,那么我会考虑在保存之前对文件名进行自己的编码/解码,例如: URLEncoder.encode(filename, "UTF-8")
将用户提供的名称映射到您可以在磁盘上使用的名称,URLDecoder.decode(encodedName, "UTF-8")
则反之亦然。