6

我从外部 Microsoft SQL 2008 数据库接收数据(我使用 MyBatis 进行查询)。数据编码为“Windows-1252”。

我试图重新编码为 UTF-8:

String textoFormado = ...value from MyBatis... ; 
String s = new String(textoFormado.getBytes("Windows-1252"), "UTF-8");

几乎整个字符串都被正确解码,但有些带重音符号的字母没有。

例如:

  1. 我收到了这个:Ã�vila
  2. 上面的代码使得:�?vila
  3. 我期望:Ávila
4

3 回答 3

10

显然,textoFormado是一个类型的变量String。这意味着字节已经被解码。然后 Java 在内部使用 16 位 Unicode 表示。您所做的是使用 Windows-1252 对字符串进行编码,然后使用 UTF-8 编码读取结果字节。那是行不通的。

您需要的是读取字节时的正确编码:

byte[] sourceBytes = getRawBytes();
String data = new String(sourceBytes , "Windows-1252");

要在程序中使用此字符串,您无需执行任何操作。只需使用它。如果 - 但是 - 例如,您想将数据写回文件,则需要再次编码:

byte[] destinationBytes = data.getBytes("UTF-8");
// write bytes to destination file here
于 2014-04-15T11:44:50.327 回答
1

为什么不在较低级别解决问题:从数据库中以正确编码读取字符串。

大多数 JDBC连接字符串或 URI 支持属性characterEncoding

因此,在您的 Microsoft SQL Server 案例中,您可以使用jdbc:sqlserver://localhost:52865;databaseName=myDb?characterEncoding=utf8.

然后应该以指定的编码读取每个 String 列,而无需手动(重新)将其转换为它。

也可以看看:

于 2021-07-14T18:02:15.520 回答
0

谢谢大家,我解决了。

我有下一个项目结构

  • MyBatisQueries:我有一个带有“选择”的查询,它给了我字符串
  • Pojo 来保存字符串(这给了我转换问题的字符串)
  • 使用查询和带有数据的 Pojo 对象的类(这表明我解码错误)

起初我有 (MyBatis 和 Spring 注入依赖项和参数):

public class Pojo {
    private String params;
    public void setParams(String params) {
        try {
            this.params = params;
        }
    }

}

解决方案:

public class Pojo {
    private String params;
    public void setParams(byte[] params) {
        try {
            this.params = new String(params, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            this.params = null;
        }
    }

}
于 2014-04-21T09:53:33.407 回答