2009-05-14 6 views
3

У меня есть HTML-форму, сгенерированную JSF, которая отображает входной элемент в bean setter , и мне кажется, что JSF искажает ввод unicode на пути. В частности, я применил следующее исключение для целей тестирования в настройщикеПроблема Unicode с форматами JSF и HTML?

public void setTitle(String title){ 
    System.out.println("title set with: "+title+"\n"); 
    if (title.startsWith("xxx")) { 
     throw new RuntimeException("debug exception "+title); 
    } 
    this.title = title; 
} 

Затем я ввел следующий текст в элемент ввода названия формы: «xxxx 海 陆». Затем, когда я отправлю форму, я вижу лог печати

title set with: xxxx ????? 

(на совместимом с юникодом терминале Mac). И я получаю сообщение об ошибке на странице HTML ответ:

Error setting property 'title' in bean of type 
uk.ac.lancs.e_science.sakaiproject.api.blogger.post.Post: 
java.lang.RuntimeException: debug exception xxxx ���?? 

Любые подсказки о том, что случилось? Я просто полон этого и неправильно поставил диагноз? Я думаю, что я устранил все другие возможности. Unicode, похоже, отлично работает в других компонентах одного и того же приложения.

ответ

3

Вопросы, я бы спросить:

  • Как форма, кодирующая запрос (применение/х-WWW-форм-urlencoded или многослойную/форм-данных)? Многочастные данные будут декодированы с использованием стороннего MIME-анализатора, поэтому там есть проблемы. Если данные закодированы по URL-адресу, выполняется ли это сбой?
  • Какие кодировки у браузера accepting?
  • Что encoding is the server detecting? Это набор символов Unicode?
  • Это только запись, которая записывается как lossy encoding (например, MacRoman)? Что такое сервер default charset?

Так что вы видите на консоли не обязательно, что в строке, вы можете сбросить Unicode code points с помощью этого кода:

public static void printCodepoints(char[] s) { 
    for (int i = 0; i < s.length; i++) { 
     int codePoint = Character.isHighSurrogate(s[i]) ? Character 
      .toCodePoint(s[i], s[++i]) 
      : s[i]; 
     System.out.println(Integer.toHexString(codePoint)); 
    } 
    } 
+0

Это многостраничная форма. Возможно, я попробую переключиться на кодировку url. спасибо. –

+0

ЭЙ! Кажется, это работает! Просто измените стандартную кодировку сообщения. Спасибо –

+1

Я бы не стал так быстро праздновать. Я видел multipart/form-data, используемые для ошибок _overcome_ символов, и требуется, если вы хотите выполнить загрузку файла формы. Тем не менее, по крайней мере, у вас есть представление о том, где проблема. – McDowell

0

Браузер не может отправлять unicode через провод; он должен каким-то образом закодировать unicode. Из вывода исключения (два кандзи стали пятью символами), я предполагаю, что данные были закодированы как UTF-8, а строка title не была правильно декодирована после приема на стороне сервера.

Предлагаю установить атрибут accept-charset для формы. Это должно заставить всех себя вести.

+0

Ваше предположение мое предположение тоже. Мне нужно использовать utf-8 (мое образовательное приложение может включать в себя китайский и санскрит в одном и том же элементе ввода). Я не уверен, как установка accept-charset на стороне клиента сделает компонент на стороне сервера правильно декодировать utf-8. Как это работает? Во всяком случае, что такое синтаксис? Я дам ему попробовать ... –

+0

Сообщение формы/get на самом деле является запросом HTML. С помощью accept-charset вы указываете браузер, который кодирует сервер. Браузер также поместит эту информацию в поле заголовка запроса, чтобы ваша инфраструктура увидела его. Таким образом, все вовлеченные люди получат подсказку, что делать. –

Смежные вопросы