我有一个 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工作流程?
答案 0 :(得分:5)
InputStreamReader
将指定编码中的外部表示形式(在您的情况下为UTF-16)转换为内部表示形式(即char
,String
),始终为UTF-这也是有效的,你的情况下没有转换。
String
的内部表示应该由JDBC驱动程序转换为数据库编码,所以你不应该关心它(尽管在MySQL的情况下你应该关心在中指定正确的数据库编码)连接字符串)。
如果正确指定了输入编码和(在MySQL的情况下)数据库编码,则在转换期间不存在数据丢失的可能性,因为UTF-8和UTF-16都用于表示相同的字符集。
答案 1 :(得分:2)
UTF-8和UTF-16覆盖相同的字符范围(完整的Unicode),因此如果输入数据有效,输出数据也将有效(除非dao.save()
中存在错误)。