Вопрос по java – Сервлет получает странный персонаж с американской международной клавиатурой на Mac

4

У меня есть простая форма, где я могу напечатать некоторые символы. Эти символы отправляются сервлету, который выполняет getBytes и печатает байты. Правильные байты UTF-8 для символа & # xE3; & quot; -61 и -93, но я получаю -52 и -93. :(

Я перепробовал все, чтобы понять и исправить это, но ничего не получалось. Все на моей машине должно быть UTF-8, поэтому я подозреваю, что это связано с клавиатурой US International, которую я использую в течение 20 лет.

Есть ли у какой-нибудь умной души подсказка, откуда взялись -52 и -93?

ИСПРАВЛЕНО на причале: см. Мой ответ ниже.

Сломано на Tomcat:Как заставить tomcat понять кодировку MacRoman (x-mac-roman) с моей клавиатуры Mac?

ЗвонокgetBytes() в строке не очень хороший способ определить, что былона самом дел послал. Используйте Wireshark или что-то подобное. Jon Skeet

Ваш Ответ

2   ответа
3

после 8 часов (серьезно!) Похоже, что единственный способ заставить это работать правильно - это сделать:

Одной из проблем было: плохая компиляция кодовых файлов компиляции файлов классов.

export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
mvn clean install

А ТАКЖЕ

   <%@page pageEncoding="UTF-8" %>

В НАСТОЯЩЕЕ ВРЕМЯ

Нет способа узнать последний вариант в вашем pom.xml.

Вот ожидающий ответ на этот вопрос: включение кодировки UTF-8 для исходных файлов clojure

9

Mac OS Римская кодировка символов. (0xBB == -52.)

Некоторые вещи, чтобы проверить:

getBytes(string, "UTF-8") а такжеnew String(bytes, "UTF-8"). Форма должна быть отправлена в UTF-8:response.setContentType("text/html; charset="UTF-8");. В JSP<%@page pageEncoding="UTF-8"%><form action="..." accept-charset="UTF-8">

Как все это не помогло:

Установить фильтрация запросов в вашем веб-приложении (web-xml).

Кодирование в pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>...</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>${project.build.sourceEncoding}</encoding>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>...</version>
    <configuration>
        <encoding>${project.build.sourceEncoding}</encoding>
    </configuration>
</plugin>
...
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Спасибо Joop, но это не сработало. Я думаю, что бы я ни делал, веб-контейнер получает Mac OS Roman и не знает, что с ним делать. Кодировка моего браузера установлена в UTF-8. : chrisapotek
Я отчаянно пытаюсь здесь все, что ты предложил ... chrisapotek
Интересно то, что для одного символа вы получаете два байта, поэтому UTF-8 готов (хотя и неправильно). Но где-то вы получаете Mac Roman, и преобразование ISO-8859-1 в UTF-8 выполняется. Вы пробовали это с другим браузером? Вы проследилиrequest.getEncoding()? Joop Eggen
Как «информация о странице» вы, вероятно, увидите фактическую кодировку. Accept-charset можно увидеть в «источнике страницы». Последнее, возможно, было забыто. Или у вас может быть очень старый браузер. Может быть,<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> может быть последним средством. Joop Eggen

Похожие вопросы