从文件中读取UTF-16字符并将其存储为UTF-8

时间:2011-02-24 12:33:18

标签: java file utf-8

我有一个 Person pojo,带有 name 属性,我将其存储在我的数据库中的各个 person 表中。我的数据库服务器是MySQL,其中utf-8设置为默认服务器编码,人员表是一个InnoDB表,也是使用utf-8作为默认编码创建的,我的数据库连接字符串指定了utf -8作为连接编码。

我需要创建和存储新的Person pojos,通过从txt文件( persons.txt )中读取其名称,每个行包含一个名称,但文件编码为 UTF-16

persons.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 个答案:

答案 0 :(得分:5)

InputStreamReader将指定编码中的外部表示形式(在您的情况下为UTF-16)转换为内部表示形式(即charString),始终为UTF-这也是有效的,你的情况下没有转换。

String的内部表示应该由JDBC驱动程序转换为数据库编码,所以你不应该关心它(尽管在MySQL的情况下你应该关心在中指定正确的数据库编码)连接字符串)。

如果正确指定了输入编码和(在MySQL的情况下)数据库编码,则在转换期间不存在数据丢失的可能性,因为UTF-8和UTF-16都用于表示相同的字符集。

答案 1 :(得分:2)

UTF-8和UTF-16覆盖相同的字符范围(完整的Unicode),因此如果输入数据有效,输出数据也将有效(除非dao.save()中存在错误)。