Имена файлов, содержащие не языковые символы международного языка - PullRequest
3 голосов
/ 26 февраля 2009

Кто-нибудь имел опыт создания файлов с именами файлов, содержащими символы не-ascii международного языка?

Легко ли это сделать или это чревато опасностью?

Ожидается ли эта функциональность от пользователей веб-сайтов, говорящих на японском / китайском?

Должны ли расширения файлов также быть символами международного языка?

Информация: В настоящее время мы поддерживаем мультиязычность на нашем сайте, но наши имена файлов всегда ASCII. Мы используем ASP.NET на платформе .NET. Это будет использоваться в сценарии, где международные пользователи могут выбрать общий формат и имя для своих файлов.

Ответы [ 5 ]

6 голосов
/ 26 февраля 2009

Ожидается ли эта функциональность от пользователей веб-сайтов, говорящих на японском / китайском?

Да.

Делать это легко, или это чревато опасностью?

Есть проблемы. Если вы обслуживаете файлы напрямую или у вас есть имя файла в 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 для встраивания символов Юникода в параметр заголовка Content-Disposition (RFC2183), а RFC2616 откладывает обращение к RFC2183 для определения этого заголовка. Но HTTP на самом деле не является протоколом семейства RFC822, и его синтаксис заголовка все равно не полностью совместим с семейством 822. Таким образом, стандарт представляет собой кровавую неразбериху, и никто не знает, что делать, конечно, не производители браузеров, которые вообще не обращают на это внимания. Черт, они даже не могут получить правильный формат ‘filename =" ... "в формате" кавычка ", не говоря уже о кодировке символов.

Таким образом, если вы хотите динамически обрабатывать файл с не-ASCII-символами в имени, уловка заключается в том, чтобы не посылать параметр «filename» и вместо этого выводить имя файла, которое вы хотите, в завершающей части URL.

Должны ли расширения файлов также быть символами международного языка?

В принципе, да, расширения файлов являются лишь частью имени файла и могут содержать любой символ.

На практике в Windows я не знаю ни одного приложения, которое когда-либо использовало расширение не-ASCII.

И последнее, на что нужно обратить внимание в системах для восточноазиатских пользователей: вы обнаружите, что они иногда печатают странные, не ASCII-версии латинских символов. Они известны как формы полной ширины и полуширины и предназначены для того, чтобы азиаты могли вводить латинские символы, которые совпадают с квадратной сеткой, используемой их идеографическими символами (хань и т. Д.).

Это все очень хорошо в свободном тексте, но для полей, которые вы собираетесь анализировать как латинский текст или числа, получение неожиданного расширения ‘inte’ integer или ‘.txt может сбить вас с толку. Чтобы преобразовать эти «символы совместимости» в обычную латиницу, нормализуйте строки в «Unicode Normal Form NFKC», прежде чем что-либо делать с ними.

1 голос
/ 26 февраля 2009

См. Этот обзор ограничений имен файлов в Википедии.

Вам нужно будет учитывать, куда будут перемещаться ваши файлы, и придерживаться самого строгого набора правил.

1 голос
/ 26 февраля 2009

Исходя из моего опыта в Японии, имена файлов обычно сохраняются на японском языке со стандартным английским расширением. Примените то же самое к любому другому языку.

Единственная проблема, с которой вы столкнетесь, заключается в том, что в неподдерживаемой среде для этого набора символов люди обычно просто видят целый ряд квадратов с расширением. Очевидно, что это не будет проблемой для ваших целевых пользователей.

0 голосов
/ 18 марта 2011

Мои два цента:

  1. Ключевым моментом для международных имен файлов является создание таких URL-адресов, как bobince : www.example.com/files/%E3%81%93%E3%82%93%E3.txt

  2. Мне пришлось сделать специальную процедуру для IE7, поскольку он обрезает имя файла, если его длина превышает 30 символов. Поэтому вместо «Ваш очень длинный файл name.txt» файл будет отображаться как «% d4y long file name.txt». Однако интересно то, что IE7 действительно понимает вложение заголовка, имя файла =% E3% 81% 93% E3% 82% 93% E3.txt.

0 голосов
/ 26 февраля 2009

Я некоторое время играю с юникодом и индийскими языками. Вот мои взгляды на ваши вопросы:

Это просто. Вам потребуется две вещи: включить поддержку Unicode (UTF-8/16/32) в вашей ОС, чтобы вы могли печатать эти символы и получать совместимые с Unicode редакторы / инструменты, чтобы ваши инструменты понимали эти символы. 1005 *

Кроме того, поскольку вы просматриваете локализованное веб-приложение, вы должны убедиться или по крайней мере сообщить своему посетителю, что ему / ей необходим браузер, использующий соответствующую кодировку.

Ваши расширения файлов нужно не быть i18-ned.

...