Вывод специального символа FreeMarker в виде вопросительного знака

Я пытаюсь отправить форму с полями, содержащими специальные символы, например €ŠšŽžŒœŸ. Насколько я вижу на странице википедии ISO-8859-15, эти символы включены в стандарт. Несмотря на то, что для запроса и ответа задана кодировка ISO-8859-15, когда я пытаюсь отобразить значения (используя FreeMarker 2.3.18 в среде JAVA EE), значения равны ???????. Я установил допустимую кодировку формы на ISO-8859-15, я проверил, что форма отправлена ​​с типом содержимого text/html;charset=ISO-8859-15 (используя firebug), но я не могу понять, как отображать правильные символы. Если я запускаю следующий код, отображается правильное шестнадцатеричное значение (ex: Ÿ = be).

Что мне не хватает? Заранее спасибо!

System.out.println(Integer.toHexString(myString.charAt(i)));

ИЗМЕНИТЬ:

У меня есть следующий код, когда я обрабатываю запрос:

PrintStream ps = new PrintStream(System.out, true, "ISO-8859-15");
String firstName = request.getParameter("firstName");

// check for null before
for (int i = 0; i < firstName.length(); i++) {
     ps.println(firstName.charAt(i)); // prints "?"
}

BufferedWriter file=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), "ISO-8859-15"));
file.write(firstName); // writes "?" to file (checked with notepad++, correct encoding set) 
file.close();

person Alex    schedule 10.06.2014    source источник
comment
У меня есть среда freemarker/spring/tomcat. Мой отображает вопросительный знак и отправляется как вопросительный знак по сети, однако я настроил FM для вывода сначала в StringWriter, и в этот момент исходный символ все еще Ÿ, поэтому я предполагаю, что проблема возникает после FM обработал вывод.   -  person Goose    schedule 10.06.2014


Ответы (1)


В соответствии с шестнадцатеричным значением данные формы передаются правильно. Проблема, кажется, связана с выходом. Java заменяет символ на ?, если он не может быть представлен с помощью используемой кодировки.

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

Writer out = new OutputStreamWriter(System.out);

Это должно быть заменено чем-то вроде этого:

Writer out = new OutputStreamWriter(System.out, "iso-8859-15");

Кстати, UTF-8 обычно намного лучше подходит для кодировки.

person Marwin    schedule 10.06.2014
comment
Я попытался использовать это в небольшом проекте, и это сработало. Кодировка не указана. Благодарю вас! - person Alex; 10.06.2014