UTF8 преобразование для текста, полученного из Интернета - PullRequest
1 голос
/ 16 декабря 2011

ElasticSearch - это поисковый сервер, который принимает данные только в формате UTF8.

Когда я пытаюсь дать ElasticSearch следующий текст

Малые предприятия, которые потенциально в очереди для более легкой загрузки отчетов, включают те,с годовым оборотом менее 440 000 фунтов стерлингов, чистые активы менее 220 000 фунтов стерлингов и менее десяти сотрудников "

Через мое Java-приложение - в основном мое Java-приложение берет эту информацию с веб-страницы и даетэто кasticSearch. ES жалобы, что он не может понять £, и это терпит неудачу. После фильтрации по приведенному ниже коду -

byte bytes[] = s.getBytes("ISO-8859-1");
s = new String(bytes, "UTF-8");

Здесь £ преобразуется в

Но затем, когда я копируюэто файл в моей домашней директории, использующий bash, и он работает нормально. Любые указатели помогут.

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

У вас есть октеты ISO-8895-1 в bytes, которые затем вы говорите String для декодирования, как если бы это было UTF-8.Когда он это делает, он не распознает недопустимую последовательность 0xA3 и заменяет ее символом подстановки.

Чтобы сделать это, вы должны сконструировать строку с использованием используемой им кодировки, а затем преобразовать ее в нужную вам кодировку.См. Как мне конвертировать между ISO-8859-1 и UTF-8 в Java? .

0 голосов
/ 16 декабря 2011

String s - это серия символов, которые в основном не зависят от какой-либо кодировки символов (хорошо, не совсем независимы, но достаточно близки для наших нужд сейчас). В какой бы кодировке ваши данные ни находились, когда вы загружали их в строку, они уже были декодированы. Декодирование выполнялось либо с использованием системной кодировки по умолчанию (которая практически ВСЕГДА ОШИБКА, никогда не используйте системную кодировку по умолчанию, поверьте мне, у меня более 10 лет опыта работы с ошибками, связанными с неправильными кодировками по умолчанию) или кодировкой, которую вы явно указали когда вы загрузили данные.

Когда вы вызываете getBytes ("ISO-8859-1") для строки, вы запрашиваете, чтобы строка была закодирована в байтах в соответствии с кодировкой ISO-8859-1.

Когда вы создаете строку из байтового массива, вам необходимо указать кодировку, в которой представлены символы в байтовом массиве. Вы создаете строку из байтового массива, которая была закодирована в UTF-8 (и чуть выше, чем вы закодировали ее в ISO-8859-1, это ваша ошибка).

То, что вы хотите сделать, это:

byte bytes[] = s.getBytes("UTF-8");
s = new String(bytes, "UTF-8");
0 голосов
/ 16 декабря 2011

UTF-8 проще, чем кажется. В String все символы юникода. Преобразование байтов / строк выполняется следующим образом. (Примечание. Cp1252 или Windows-1252 - это расширение Windows Latin1 ISO-8859-1; лучше использовать тот.)

BufferedReader in = new BufferedReader(
        new InputStreamReader(new FileInputStream(file), "Cp1252"));
PrintWriter out = new PrintWriter(
        new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
response.setContentType("text/html; charset=UTF-8");
response.setEncoding("UTF-8");
String s = "20 \u00A3"; // Escaping

Чтобы понять, почему Cp1252 больше подходит, чем ISO-8859-1: http://en.wikipedia.org/wiki/Windows-1252

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...