2010-06-22 5 views
3

Я делаю работу для французского клиента, поэтому мне нужно иметь дело с акцентированными персонажами. Но я сталкиваюсь с большими трудностями, я надеюсь, что решение будет простым и что кто-нибудь может указать на меня.Специальные и акцентированные символы

Строка: La Forêt pour Témoin преобразуется в: La For? pour T?oin

Примечание недостающий символ после акцентированного персонажа - т после ê и м после Шахматный.

Я пробовал использовать StringEscapeUtils, который успешно удалял некоторые символы, такие как ă. Я также создал свою собственную функцию эвакуации, которая дает те же результаты (ă будет работать, ê не будет).

private String escapeChars(String string) { 
    char[] chars = string.toCharArray(); 
    String result = ""; 
    for (int i = 0; i < chars.length; i++) { 
     int c = chars[i]; 
     result += "&#" + c + ";"; 
    } 
    return result; 
} 

Проект выполняется в затмении, используя плагин App Engine, я не могу сузить ли проблема вызвана Java, App Engine, или SQLite.

Любая помощь приветствуется.

EDIT: Я обнаружил, что строка неверна при простом отображении параметра запроса из формы. (т. е. request.getParameter («string») уже имеет искаженное содержимое).

Я пробовал метатег, предложенный Даниэлем, без успеха. Я думаю, что вы на правильном пути, хотя, данные заголовка документа HTML следующим образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

Когда акцентированные символы жестко закодированы в JSP они отображаются как задумано.

EDIT: Я также добавил <?xml version="1.0" encoding="UTF-8"?> в начало страницы.

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

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

ПОСТАНОВИЛИ: Я не мог понять, как сделать браузер автоматически определять кодировку UTF-8, который Java по умолчанию. Поэтому я кодировал кодировку ISO-8859-1 с использованием request.setCharacterEncoding («ISO-8859-1»).

+1

Не то, что это решит проблему, но это хорошо читать: http://www.joelonsoftware.com/articles/Unicode.html –

+0

Если параметры запроса в результате отправки формы являются неправильными, то браузер определенно пытается использовать автообнаруженный набор символов, который не может представлять символы с акцентом. Попробуйте добавить: '' В самом начале документа, которому не предшествуют никакие пробелы; они должны быть первыми символами документа XHTML. –

ответ

6

EDIT: Я обнаружил, что строки являются уродливы, когда просто отображает параметр запроса от формы. (т. е. request.getParameter («string») уже имеет искаженное содержимое).

Это может иметь три причины:

  1. Это запрос GET и сервер не настроен на использование UTF-8 для разбора запроса URI. Непонятно, какой сервер вы используете, поэтому в качестве примера можно привести ответ Tomcat: установить URIEncoding атрибут HTTP Connector в /conf/server.xml - UTF-8.

  2. Если это запрос POST, вам необходимо убедиться, что servletcontainer использует UTF-8 для кодирования тела запроса. Вы можете сделать это на request.setCharacterEncoding("UTF-8") заранее.

  3. Консоль, которую вы пишете параметр, не поддерживает UTF-8. Непонятно, о какой консоли вы говорите, поэтому в качестве примера можно привести ответ, ориентированный на Eclipse: в окне Окно> Предпочтения> Общие> Рабочее пространство> Кодировка текстового файла установите его в UTF-8.

Смотрите также:

1

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

  • Добавить подходящее ведение журнала символов Юникода (в идеале в шестнадцатеричном формате), чтобы вы могли видеть, можете ли вы писать на SQLite и правильно извлекать данные.
  • Hard-код некоторые данные, чтобы вы могли убедиться в том, что возвращается правильно
  • Убедитесь, что в любом у вас есть текст-в-бинарного преобразования, необходимо указать соответствующую кодировку (например, UTF-8)

Вы не сказали , где все идет не так, но я бы ожидал, что если вы разобрались с кодировкой символов, остальные должны встать на свои места. Возможно, У SQLite есть проблемы, но я сомневаюсь ...

+0

Я думаю, что я сузил проблему, чтобы запросить заголовки, созданные клиентом. См. Правки выше. – klonq

0

Возможно ли, что строка находится в такте, но вы пытаетесь напечатать эти символы с помощью локальной локализации?

+0

Независимо от того, содержит ли заголовок ответа HTTP допустимый язык, заданный в поле «Content-Language», не имеет никакого значения. Проблема здесь в том, что кодировка HTML-файла отличается от кодировки, на которой сервер расшифровывает файл, и говорит клиенту расшифровать файл. Локализация в этом случае не имеет значения. – ThePyroEagle

1

Вы должны убедиться, что HTML-код, отправленный обратно в браузер, имеет кодировку. Вы оба должны послать назад Content-Type: text/html; charset=UTF-8 в качестве заголовка ответа HTTP и включают в себя, в качестве первого дочернего элемента head тега:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

Или, если вы используете XHTML:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

Хотя только наличие тега meta часто устраняет проблему.

Также убедитесь, что ваш HTML-код действителен, используя W3C Markup Validation Service.

Смотрите также: FAQ: Weird characters and question marks appear instead of accented characters

+0

Я дал метатег выстрел. Не разрешил проблему. Я рассмотрю приведенные вами рекомендации – klonq

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