Почему по умолчанию устаревший java.net.URLEncoder.encode работает, а не когда я указываю набор символов? - PullRequest
2 голосов
/ 19 ноября 2011

Я анализирую некоторые ссылки на изображения в Википедии.Я сталкивался с этим на http://en.wikipedia.org/wiki/Special:Export/Diego_Forl%C3%A1n

Когда я использую устаревший код URLEncoder.encode, я могу правильно кодировать символы с акцентом, но когда я указываю аргумент "UTF-8", это не получается.Текст в Википедии - utf8 AFAIK.

Диего + Форл% C3% A1n + vs + + Netherlands.jpg является правильным, тогда как Диего + Форл% E2% 88% 9A% C2% B0n + vs + +Netherlands.jpg неверно.

scala> first
res24: String = Diego Forlán vs the Netherlands.jpg

scala> java.net.URLEncoder.encode(first, "UTF-8")
res25: java.lang.String = Diego+Forl%E2%88%9A%C2%B0n+vs+the+Netherlands.jpg

scala> java.net.URLEncoder.encode(first)
<console>:33: warning: method encode in object URLEncoder is deprecated: see corresponding Javadoc for more information.
              java.net.URLEncoder.encode(first)
                                  ^
res26: java.lang.String = Diego+Forl%C3%A1n+vs+the+Netherlands.jpg

1 Ответ

1 голос
/ 19 ноября 2011

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

Это можно подтвердить, выдав кодовые единицы UTF-16 в строке:

for(c<-first.toCharArray()){print("\\u%04x".format(c.toInt))}

Вероятно, есть более элегантный способ написать это.

Если кодовая точка закодирована правильно, это будет:

U+00e1      á       \u00e1

Я ожидаю, что где-то кодированные данные UTF-8 декодируются с использованием декодера MacRoman.

codepoint   glyph   escaped    x-MacRoman     info
=======================================================================
U+221a      √       \u221a     c3,            MATHEMATICAL_OPERATORS, MATH_SYMBOL
U+00b0      °       \u00b0     a1,            LATIN_1_SUPPLEMENT, OTHER_SYMBOL
...