Чтение символов UTF-16 из файла и сохранение их как UTF-8 - PullRequest
5 голосов
/ 24 февраля 2011

У меня есть Person pojo с атрибутом name , который я храню в своей базе данных в соответствующей таблице person .Мой db-сервер - MySQL, в качестве серверной кодировки по умолчанию установлена ​​utf-8, таблица Person - это таблица InnoDB, которая также была создана с использованием utf-8 в качестве кодировки по умолчанию, а в моей строке подключения к db указано utf-8 как кодировка соединения.

Мне необходимо создавать и хранить новые pojos Person, считывая их имена из txt-файла ( Person.txt ), который содержит имя в каждой строке, но кодировка файла UTF-16 .

person.txt

Джон

Μαρία

Элен

и т. Д.

Вот пример кода:

PersonDao dao = new PersonDao();
File file = new File("persons.txt");
BufferedReader reader = new BufferedReader(
                        new InputStreamReader(new FileInputStream(file), "UTF-16"));
String line = reader.readLine();
while (line!=null) {
    Person p = new Person();
    p.setName(line.trim());
    dao.save(p);
    line = reader.readLine();
}

Подводя итог, я читаю строковые символы как utf-16, сохраняю их в локальных переменных и сохраняю их как utf-8.

Я хотел бы спросить: происходит ли какое-либо преобразование символов во время этой процедуры?Если да, то в какой момент это происходит?Возможно ли, что я смогу хранить неработающие символы из-за рабочего процесса utf-16 -> utf-8?

Ответы [ 2 ]

5 голосов
/ 24 февраля 2011

InputStreamReader преобразует символы из их внешнего представления в указанной кодировке (UTF-16 в вашем случае) во внутреннее представление (то есть char, String), то есть всегда тоже UTF-16, так эффективно здесь нет конвертации в вашем случае.

Внутреннее представление String s должно быть преобразовано в кодировку базы данных вашим драйвером JDBC, поэтому вам не следует об этом беспокоиться (хотя в случае MySQL вам следует позаботиться об указании правильной кодировки базы данных в строке подключения ).

Если входное кодирование и (в случае MySQL) кодирование базы данных заданы правильно, шансов потери данных при преобразованиях нет, поскольку UTF-8 и UTF-16 используются для представления одного и того же набора символов.

2 голосов
/ 24 февраля 2011

UTF-8 и UTF-16 охватывают один и тот же диапазон символов (полный Юникод), поэтому, если входные данные действительны, выходные данные также будут действительными (если в dao.save() нет ошибки).

...