Grails UrlEncoding нелатинских символов, таких как åäö - PullRequest
1 голос
/ 13 января 2012

У меня есть несколько ресурсов ссылок без латинских символов, таких как åäö. Обычно это загруженные пользователем файлы.

Проблема в том, что мне не удается их кодировать

с использованием filename.encodeAsURL, похоже, нетзакодируйте его правильно

Например, символ ö превращается в o% CC% 88 При тестировании для ввода того же самого в Firefox и копирования содержимого выдается% C3% B6

Разница между этими кодировками и что я должен использовать, чтобы получить правильную кодировку ??

1 Ответ

2 голосов
/ 14 января 2012

Обе кодировки верны.Вы на самом деле видите кодировку двух разных строк.

Ключ здесь замечает o в начале строки:

o%CC%88 - это буква o, за которой следует Объединение символов Unicode Diaeresis , которое комбинируется с предыдущим символом при визуализации.

%C3%B6 is Символ Unicode Latin Latin O С Diaeresis .

Что вы видите, так это то, что в первом случае введенная строка представляет собой что-то вроде этих двух символов: o ¨, которые фактически отображаются как ö.Во втором случае это фактический символ ö.

Я предполагаю, что вы видите разницу между двумя различными входами.


Обновление на основе нижеследующего обсуждения: Если выДинамическая обработка символов Юникода, и у вас нет контроля над методами ввода, вы можете попытаться нормализовать Юникод, используя java.text.Normalizer (Java 1.6 или новее).

Нормализацияпытается гарантировать, что все символы представлены последовательно, чтобы акцентированные символы всегда были представлены комбинированным символом или всегда символом + знаком объединения.

Грубый пример:

String.metaClass.normalizeUnicode = {
    return java.text.Normalizer.normalize(delegate, java.text.Normalizer.Form.NFC)
}

input = input.normalizeUnicode()

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


С учетом всего вышесказанного, если вы пытаетесь представить символы Unicode в URL-адресе, а они не загружаются и не обрабатываются непосредственно кодом, вероятно, лучше всего избегать использования нелатинских символов.Это дает не только постоянные, но и значительно более короткие и удобочитаемые URL-адреса.boo.pdf намного легче читать, чем bo%CC%88o.pdf.

...