Кодировать заглавные буквы с ударением в UTF-8 - PullRequest
0 голосов
/ 02 июля 2018

Я использую следующий код для изменения текстов строк, чтобы он использовал формат UTF-8.

public String encodeUTF(String text){
    byte[] ptext = text.getBytes(ISO_8859_1); 
    String value = new String(ptext, UTF_8); 
    return value;
}

В большинстве случаев строки кодируются правильно, ЕСЛИ СТРОКА не имеет заглавной буквы с ударением.

Так, например: Это текст, который был преобразован: Альфредо Арайя Хименес, но когда я пытаюсь преобразовать тот же текст, но в верхнем регистре, это то, что он мне дает: АЛЬФРЕДО АРАЯ ДЖИМ ? NEZ

Я не понимаю, в чем проблема, помогите!

1 Ответ

0 голосов
/ 02 июля 2018

Я вижу проблему. Вы не можете закодировать строку в байты с одной кодировкой и декодировать ее обратно с другой. Если вы хотите преобразовать несколько байтов из / в строку UTF-8, сделайте это только в одну сторону. Класс Java String также использует другую кодировку. Преобразование допустимо (применяется) только во время преобразования из / в строку Java. Если вы хотите преобразовать что-либо из строки UTF-8 в строку Java, сначала поместите это в массив байтов (побайтно или считывая из потока), а затем выполните это ...

Чтобы показать проблему, я запустил ваши строки в моей структуре. (Вам просто повезло, что кодировка вашей консоли или что-то показала вам правильный é в строчной версии.)

Код в моих рамках:

String text = "Alfredo Araya Jiménez";
byte[] ptext = text.getBytes(ISO_8859_1);

String incorrectValue = new String(ptext, UTF_8);
World.writeLine(incorrectValue);

String correctValue = new String(ptext, ISO_8859_1);
World.writeLine(correctValue);

text = "ALFREDO ARAYA JIMÉNEZ";
ptext = text.getBytes(ISO_8859_1);

incorrectValue = new String(ptext, UTF_8);
World.writeLine(incorrectValue);

correctValue = new String(ptext, ISO_8859_1);
World.writeLine(correctValue);

Результат:

The result…

<Ч />

Редактировать

То есть вы изменили это так?

public String encodeUTF(String text)
{
    byte[] ptext = text.getBytes(ISO_8859_1);
    String value = new String(ptext, ISO_8859_1);
    return value;
}

На самом деле вам нужно что-то вроде этого (если вы хотите использовать «текст» в Java):

public String encodeUTF(byte[] ptext)
{
    String value = new String(ptext, ISO_8859_1);
    return value;
}

Но в этом случае ваш метод бессмысленен (понимаете?)… Сначала вам нужно получить свой «текст» в байтах, а затем преобразовать его в правильную строку Java и работать с ней в Java (только в Java) , Java работает с UTF-16 (как указывал Том Блоджет 8 часов назад).

Если вам нужно конвертировать его в UTF-8, вы должны «экспортировать» его так:

public byte[] encodeUTF(byte[] ptext)
{
    String value = new String(ptext, ISO_8859_1);
    byte[] utf8Text = value.getBytes(UTF_8);
    return utf8Text;
}
...