Сценарий использования
Мы внедрили веб-сервис, который разработчики нашего веб-интерфейса используют (через 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 4xx статусом
Текущее решение в деталях
Проверка для каждого символа (== string.substring (i, 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 вздох