2015-04-02 5 views
0

У меня возникли проблемы с отображением «велярного носового» символа (ŋ) (но я предполагаю, что одна и та же проблема возникла бы с другими редкими символами).Символ, не отображающийся в html

У меня есть таблица MySQL, которая содержит слово с этим символом. Когда мой код извлекает его для отображения на моей странице HTML, он отображается как знак вопроса.

Я попробовал несколько вещей: 1) Пробовал с помощью CONVERT MySQL, чтобы преобразовать извлеченную строку в UTF-8, потому что я понял, что строка хранится в моей таблице как «Latin1»:

SELECT CONVERT(Name USING utf8) 

Вместо:

SELECT Name 

Это не помогло, и, когда я сохранил строку в моем Java коде с проблемным словом («Yolŋu»), а затем передал строку через остальную часть коды проблемы все еще происходило (т. е. проблема не в разных кодировка символов, используемая моей БД).

2) Я также попытался создать новую строку из байтов:

new String(name.getBytes("UTF-8")); 

Строка в настоящее время передается от Java в HTML с помощью JSONObject, который передается в файла JavaScript:

Соответствующий формат JSON код:

JSONArray names = new JSONArray(); 
     for (int iD: iDs) 
     { 
      JSONObject namesData = new JSONObject(); 
      String name = NameDB.getNameName(iD); 
      nameData.put("label", name); 
      nameData.put("value", iD); 
      names.put(nameData); 
     } 
     return names; 

Соответствующий код сервлета:

response.setContentType("application/json"); 

     try (PrintWriter out = response.getWriter()) 
     { 
      out.print(namesJSONArray); 
     } 

Соответствующий код js:

Ajax-вызов сервлета производится через автозаполнение jquery ui «source».

Я довольно новичок в кодировании в целом и очень новичок в теме кодирования символов.

спасибо.

ответ

0

Во-первых, в Java String должно быть выполнено правильное Unicode, поэтому new String(string.getBytes(...), ...) - это взломать, с собственными проблемами.

1. База данных

Было бы хорошо, если база данных держал текст в UTF-8.Кодировка может быть установлена ​​на уровне базы данных, таблицы и столбца. Прежде всего, нужно исследовать как текст сохраняется. Дамп таблицы (mysqldump) был бы наименее подверженным ошибкам.

Если вы можете использовать UTF-8, это должно быть задано в форме MySQL для механизма базы данных и для передачи данных для java-драйвера.

В каждом случае вы можете проверить обратное путешествие в java JDBC, заполнив поле таблицы и прочитав его снова, а также прочитав это существующее неприятное поле.

Дамп кодовых точек строки.

String dump(String s) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < s.length();) { 
     int cp = s.codePointAt(i); 
     if (32 < cp && cp < 128) { 
      sb.append((char) cp); 
     } else { 
      sb.append("U+").append(Integer.toHexString(cp)); 
     } 
     sb.append(' '); 
     i += Character.charCount(cp); 
    } 
    return sb.toString(); 
} 

2. Выход

Здесь, вероятно, лежит ошибка. Вызов в начале:

response.setCharacterEncoding("UTF-8"); 
... response.getWriter(); // Now converts java's Unicode text to UTF-8. 

Для HTML спецификация кодировки также в порядке. Особенно, когда страница HTML сохраняется в файловой системе, заголовок кодировки будет потерян.

+0

Отлично. Точка (2) сделала трюк. Небольшая коррекция: метод называется «setCharacterEncoding». – theyuv

+0

Исправлено для других посетителей. –

0

Вы должны убедите о следующих вещах:

  1. Ваша виртуальная машина должна работать с file.encoding=UTF-8 парам
  2. Ваш MySql таблицы, в которой содержит специальные символы должны быть параметризованных с encoding=UTF-8
  3. Ваш веб-интерфейс должен указать метатег с кодировкой вы сохранили веб-страницу в своем редакторе, поэтому UTF-8

Если проблема persi sts, попробуйте вместо этого использовать HTML entities(&entity).

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