3

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

这样做是一件容易的事,还是充满危险?

日语/中文网络用户是否需要此功能?

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

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

4

5 回答 5

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"

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

乏味的一边:标准说应该发生什么?嗯,它不是真的。HTTP 标准 RFC2616 规定 HTTP 标头中的字节是 ISO-8859-1,这不允许我们使用日语。它继续说,非拉丁 1 字符可以通过 RFC2047 的规则嵌入到标头中,但 RFC2047 明确否认其编码词可以放入带引号的字符串中。通常在 RFC822 系列标头中,您将使用 RFC2231 规则将 Unicode 字符嵌入 Content-Disposition (RFC2183) 标头的参数中,并且 RFC2616 确实遵循 RFC2183 来定义该标头。但 HTTP 实际上并不是 RFC822 系列协议,而且它的标头语法与 822 系列也不完全兼容。总之,标准是一团糟,没有人知道该怎么做,当然不是那些根本不关注它的浏览器制造商。见鬼,他们甚至不能正确地得到 'filename="..."' 的 'quoted-string' 格式,更不用说字符编码了。

因此,如果您想动态地提供名称中包含非 ASCII 字符的文件,诀窍是避免发送“文件名”参数,而是将您想要的文件名转储到 URL 的尾部。

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

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

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

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

在自由文本中这一切都很好,但是对于您希望解析为拉丁文本或数字的字段,接收到意外的“42”整数或“.txt”文件扩展名可能会让您大吃一惊。要将这些“兼容字符”转换为纯拉丁文,请在对它们进行任何操作之前将您的字符串规范化为“Unicode 范式 NFKC”。

于 2009-02-26T11:29:56.447 回答
1

请参阅Wikipedia 上的文件名限制概述。

您将不得不考虑您的文件将传输到哪里,并遵守最严格的规则集。

于 2009-02-26T03:35:04.157 回答
1

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

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

于 2009-02-26T03:46:38.230 回答
0

一段时间以来,我一直在使用 Unicode 和印度语言。以下是我对您的问题的看法:

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

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

您的文件扩展名不需要是 i18-ned。

于 2009-02-26T03:28:57.027 回答
0

我的两分钱:

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

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

于 2011-03-18T13:05:18.943 回答