包含非ascii国际语言字符的文件名

时间:2009-02-26 03:21:12

标签: asp.net unicode localization internationalization filenames

有没有人有过生成文件名包含非ascii国际语言字符的文件的经验?

这样做很容易实现,还是充满了危险?

此功能是否适用于日语/中文网络用户?

文件扩展名是否也应该是国际语言字符?

信息:我们目前在我们的网站上支持多语言,但我们的文件名始终是ASCII。我们在.NET框架上使用ASP.NET。这将用于国际用户可以为文件选择通用格式和名称的情况。

5 个答案:

答案 0 :(得分:6)

  

此功能是否适用于日语/中文网络用户?

  

这样做是否容易实现,还是充满了危险?

有问题。如果您直接提供文件,或者在URL中有文件名(例如:http:// www.example.com/files/こんにちは.txt - > http:// www.example.com/files /%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF.txt),你一般都可以。

但是,如果您使用脚本生成的文件名提供文件,则可能会出现问题。问题在于标题:

Content-Disposition: attachment;filename="こんにちは.txt"

我们如何将这些字符编码为filename参数?如果我们可以将它转储到UTF-8中,那将是很好的。这将适用于某些浏览器。但不是IE,它使用系统代码页来解码来自HTTP头的字符。在Windows上,系统代码页可能是西方用户的cp1252(Latin-1),或者日语的cp932(Shift-JIS),或者完全不同的东西,但它永远不会是UTF-8,你无法猜到它是什么将在发送标题之前。

单调乏味:标准说应该发生什么?嗯,事实并非如此。 HTTP标准RFC2616表示HTTP标头中的字节是ISO-8859-1,这不允许我们使用日语。接着说,RFC2047的规则可以将非Latin-1字符嵌入到标题中,但RFC2047明确否认其编码字可以适合带引号的字符串。通常在RFC822系列标头中,您将使用RFC2231规则将Unicode字符嵌入到Content-Disposition(RFC2183)标头的参数中,而RFC2616确实遵循RFC2183来定义该标头。但HTTP实际上并不是RFC822系列协议,并且其头部语法无论如何都与822系列不完全兼容。总之,标准是一个血腥的混乱,没有人知道该怎么做,当然不是那些不关注它的浏览器制造商。天哪,他们甚至不能得到'filename =“...”'''的'引用字符串'格式,不要介意字符编码。

因此,如果您想在名称中使用非ASCII字符动态地提供文件,那么诀窍就是避免发送'filename'参数,而是将所需的文件名转储到URL的尾部。

  

文件扩展名是否也应该是国际语言字符?

原则上是的,文件扩展名只是文件名的一部分,可以包含任何字符。

在Windows上的实践中,我知道没有使用非ASCII文件扩展名的应用程序。

最后要注意东亚用户的系统:你会发现他们有时会输入奇怪的,非ASCII版本的拉丁字符。这些被称为全宽和半宽形式,旨在允许亚洲人输入拉丁字符,这些字符与其表意(汉字等)字符所使用的方格相对应。

这在自由文本中非常好,但对于您希望解析为拉丁文本或数字的字段,接收意外的'42'整数或'.txt'文件扩展名可能会让您失望。要将这些“兼容性字符”转换为普通拉丁语,请在对字符串进行任何操作之前将字符串规范化为“Unicode Normal Form NFKC”。

答案 1 :(得分:1)

请参阅维基百科上的overview of file name limitations

您必须考虑文件的传输位置,并遵守最严格的规则。

答案 2 :(得分:1)

根据我在日本的经验,文件名通常以日语保存,标准英语扩展名。将其应用于任何其他语言。

您将遇到的唯一问题是,在该字符集的不受支持的环境中,人们通常会看到一大堆带有扩展名的正方形。显然,这对您的目标用户来说不会是一个问题。

答案 3 :(得分:0)

我一直在玩Unicode和印度语。以下是我对您的问题的看法:

很容易。您将需要两件事:在您的操作系统中启用Unicode(UTF-8/16/32)支持,以便您可以键入这些字符并获得与Unicode兼容的编辑器/工具,以便您的工具了解这些字符。

此外,由于您正在查看本地化的Web应用程序,因此您必须确保或至少通知访问者他/她需要拥有使用相关编码的浏览器。

您的文件扩展名 不需要。

答案 4 :(得分:0)

我的两分钱:

  1. 国际文件名的关键是建议使用 bobince 这样的网址: www.example.com/files/%E3%81%93%E3%82%93%E3.txt

  2. 我必须为IE7制作特殊例程,因为如果它超过30个字符,它会裁剪文件名。因此,“Your very long file name.txt”文件将显示为“%d4y long file name.txt”。然而有趣的是,IE7实际上理解标题附件;文件名=%E3%81%93%E3%82%93%E3.txt正确。