Сценарий использования
Мы реализовали веб-сервис, который наши разработчики веб-интерфейса используют (через php api) для отображения данных продукта. На веб-сайте пользователь вводит что-то (т.е. Строку запроса). Внутри веб-сайт совершает звонок к службе через api.
Примечание. Мы используем restlet, а не tomcat
Исходная проблема
Firefox 3.0.10, похоже, уважает выбранную кодировку в браузере и кодирует URL-адрес в соответствии с выбранной кодировкой. Это приводит к различным строкам запроса для ISO-8859-1 и UTF-8.
Наш веб-сайт перенаправляет входные данные от пользователя и не конвертирует его (что ему нужно), поэтому он может позвонить в службу через api, вызывая веб-сервис, используя строку запроса, содержащую немецкие умлауты.
т.е. для части запроса, похожей на
...v=abcädef
если выбрано "ISO-8859-1", часть отправленного запроса выглядит как
...v=abc%E4def
но если выбрано "UTF-8", часть отправленного запроса выглядит как
...v=abc%C3%A4def
Желаемое решение
Поскольку мы управляем службой, потому что мы ее внедрили, мы хотим проверить серверную сторону, чтобы вызов содержал символы не utf-8, если это так, ответьте с помощью http:/p >
Текущее решение в деталях
Проверить для каждого символа (== string.substring(i, я + 1))
- если character.getBytes() [0] равно 63 для '?'
- если Character.getType(character.charAt(0)) возвращает OTHER_SYMBOL
код
protected List< String > getNonUnicodeCharacters( String s ) {
final List< String > result = new ArrayList< String >();
for ( int i = 0 , n = s.length() ; i < n ; i++ ) {
final String character = s.substring( i , i + 1 );
final boolean isOtherSymbol =
( int ) Character.OTHER_SYMBOL
== Character.getType( character.charAt( 0 ) );
final boolean isNonUnicode = isOtherSymbol
&& character.getBytes()[ 0 ] == ( byte ) 63;
if ( isNonUnicode )
result.add( character );
}
return result;
}
Вопрос
Будет ли это улавливать все недопустимые символы (не utf-закодированные)? У любого из вас есть лучшее (более простое) решение?
Примечание. Я проверил URLDecoder со следующим кодом
final String[] test = new String[]{
"v=abc%E4def",
"v=abc%C3%A4def"
};
for ( int i = 0 , n = test.length ; i < n ; i++ ) {
System.out.println( java.net.URLDecoder.decode(test[i],"UTF-8") );
System.out.println( java.net.URLDecoder.decode(test[i],"ISO-8859-1") );
}
Отпечатки:
v=abc?def
v=abcädef
v=abcädef
v=abcädef
и он не выдает смещение IllegalArgumentException