Кодировка Java UTF8 - PullRequest
       0

Кодировка Java UTF8

5 голосов
/ 17 января 2011

У меня есть сценарий, в котором некоторые специальные символы хранятся в базе данных (sybase) в системной кодировке по умолчанию, и мне нужно получить эти данные и отправить их стороннему пользователю в кодировке UTF-8 с помощью программы на Java.

Существует предварительное условие, что данные, отправляемые третьей стороне, не должны превышать определенный максимальный размер.Поскольку после преобразования в UTF-8 символ может быть заменен на 2 или 3 символа, моя логика подсказывает, что после получения данных из базы данных я должен кодировать их в строку UTF-8, а затем разбивать строку.Ниже приведены мои наблюдения:

Когда встречается любой специальный символ, такой как китайские или греческие символы или любой специальный символ> ASCII 256, и когда я конвертирую его в UTF-8, один символ может быть представлен болеечем 1 байт.

Так как я могу быть уверен, что преобразование правильное?Для преобразования я использую следующее

// storing the data from database into string
string s = getdata from the database;

// converting all the data in byte array utf8 encoding
byte [] b = s.getBytes("UTF-8");

// creating a new string as my split logic is based on the string format

String newString = new String(b,"UTF-8");

Но когда я вывожу эту newString на консоль, я получу ? для специальных символов.

Так что у меня есть некоторые сомнения:

  • Если моя логика преобразования неверна, то как я могу ее исправить.
  • После выполнения моего преобразования в UTF-8, могу ли я проверить еще раз, в порядке ли мое преобразование?Я имею в виду, что это правильное сообщение, которое должно быть отправлено третьей стороне, я предполагаю, что, если сообщение не читается пользователем после преобразования, тогда есть некоторая проблема с преобразованием.

БудетХотелось бы получить некоторые точки зрения от всех экспертов.

Пожалуйста, дайте мне знать, если какая-либо дополнительная информация необходима с моей стороны.

Ответы [ 5 ]

2 голосов
/ 21 августа 2011

Вы говорите, что записываете Unicode в текстовый файл, но для этого требуется преобразование из Unicode.

Но преобразование в что?Это зависит от того, как вы открываете файл.

Например, System.out.println(myUnicodeString) преобразует Unicode в кодировку, с которой был создан System.out, скорее всего, кодировку вашей платформы по умолчанию.Если вы работаете в Windows, то, вероятно, это будет windows-1252 .

Если вы скажете Java использовать кодировку UTF-8 при записи в файл, вы получитефайл, содержащий UTF-8:

PrintWriter pw = new PrintWriter(new FileOutputStream("filename.txt"), "UTF-8");
pw.println(myUnicodeString);
0 голосов
/ 06 апреля 2015

Используйте это для правильного разговора - это от iso-8859-1 до utf-8:

public String to_utf8(String fieldvalue) throws UnsupportedEncodingException{

        String fieldvalue_utf8 = new String(fieldvalue.getBytes("ISO-8859-1"), "UTF-8");
        return fieldvalue_utf8;
}
0 голосов
/ 26 февраля 2013

Пожалуйста, используйте hex-редактор , чтобы проверить, правильно ли отформатирован ваш вывод UTF8.Нет другого способа точно сказать, что то, что вы видите, не является корректором.

И прочитайте это, если вы еще не готовы: http://www.joelonsoftware.com/articles/Unicode.html

0 голосов
/ 18 января 2011

спасибо всем за ваши ответы ..

Как подсказывают некоторые из вас, я уже пытался записать его в текстовый файл, однако в текстовом файле я тоже получил? для моих специальных персонажей. Итак, у меня есть следующие наблюдения: -

a) Кодирование - это процесс, состоящий из двух частей: сначала вы меняете строку с одной кодировки на другую кодировку на уровне байтов, а затем вам также необходим требуемый шрифт для нового набора символов.

b) Если мы кодируем некоторую строку, которая означает, что мы кодируем байты, для текущего сценария я использую двойные кавычки из слова MS, а затем вставляю в базу данных sybase и после извлечения данных из db, я пишу это в текстовый файл, где я получаю то же самое? для двойных кавычек, однако, если я непосредственно копирую тот же материал из базы данных в слово MS или редактирую, плюс я могу видеть фактические символы. поэтому я не в состоянии понять эту проблему. Насколько я понимаю, во время кодирования мы должны заботиться только о значении байта, которое является реальным представлением, а не о строковом объекте, из которого мы состоим из этих байтовых массивов. Однако, если моя закодированная информация не читается человеком, как может проверить другая сторона и прочитайте его (я предполагаю, что это будут считанные байты, но если для специального символа был введен какой-то символ «как мусор» при кодировании utf8, то это не потеря информации).

Буду очень признателен за ваши взгляды на мои наблюдения и какой правильный подход я должен использовать дальше?

0 голосов
/ 18 января 2011

Строки Java являются Unicode, но не все компоненты Java поддерживают полные строки Unicode, особенно компоненты AWT и легкие компоненты Swing. Таким образом, у вас могут быть совершенно хорошие строки, но в выводе на консоль получается ненужная информация.

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