【问题标题】:Accented letters not recognized when encoding byte array编码字节数组时无法识别重音字母
【发布时间】:2018-06-21 11:18:05
【问题描述】:

我正在为我的大学开发一个项目。我在尝试将字节数组转换为字符串时遇到问题。

所以,首先我将 java 文件的内容保存在 MySql 的 long blob 类型列中,如下所示:

Path path = Paths.get(file.getAbsolutePath());
Charset charset = StandardCharsets.UTF_8;
String fileContent = new String(Files.readAllBytes(path), charset);
...
String query = "INSERT INTO MY_TABLE(FILE_CONTENT) VALUES (?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, fileContent);
preparedStmt.executeUpdate();

该文件包含一些带有西班牙口音的单词,这些单词已正确插入到数据库中(如图所示): data saved in MySql

稍后,在我的应用程序中,我需要阅读此列中的信息。我确实喜欢这样:

String query = "SELECT * FROM MY_TABLE";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
while (rs.next())
{
  Blob file= rs.getBlob("FILE_CONTENT");
  String fileContent= new String(file.getBytes(1l, (int) file.length()), StandardCharsets.UTF_8);

当我打印 fileContent 时,字符 é 无法识别。我收到这样的文字: driver.findElement(By.id("FNAME")).sendKeys("Leonardo Pa�z")

我已经尝试过这些帖子中的建议 (encoding decoding of byte array to string without data loss), (Encode String to UTF-8), (Java Strings Character Encoding - For French - Dutch Locales) 还有一些类似one的博客,但是我一直没能找到解决这个问题的办法。

任何帮助将不胜感激:)

【问题讨论】:

  • 你能提供é的十六进制吗?如果那是E9,你有 latin1;如果是C3A9,说明你的utf8格式正确。

标签: java mysql arrays string utf-8


【解决方案1】:

你说 FILE_CONTENT 是一个 blob,但你使用 setString() 来设置它的数据。来自 javadocs:

注意:用于设置的 setter 方法(setShort、setString 等) IN 参数值必须指定与 定义的输入参数的 SQL 类型。例如,如果 IN 参数的 SQL 类型为 INTEGER,则应使用方法 setInt。

由于你的类型是 blob,你必须使用 setBlob:

try (InputStream fileContent = Files.newInputStream(path))
{
    preparedStmt.setBlob(1, fileContent);
}

另一种方法是将 SQL 类型更改为 TEXT 类型之一,例如LONGTEXT(如果您期望大文件)。 BLOB 对文本没有多大意义。然后你可以简单地使用 setString() 和 getString():

rs.getString("FILE_CONTENT");

您还想将数据库/表/列编码更改为 UTF-8。

再解释一下:

当您使用 setString() 向数据库提供字符串时,Java 和您的数据库都不知道原始文件的编码。数据库使用默认编码存储字符,可能是 ISO_8859_1。由于 ISO_8859_1 具有字符 é,因此您可以在 MySQL 工作台中很好地看到它。然后,当您使用 getBlob() 获取数据并使用 UTF-8 对其进行解码时,é 字符会丢失,因为文本不是以 UTF-8 存储的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多