Java将Windows-1252转换为UTF-8,有些字母错误

时间:2014-04-15 11:36:38

标签: java utf-8 utf8-decode windows-1252

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

我尝试使用以下代码解码数据:

  

String textoFormado = ...来自MyBatis的值......;

     

String s = new String(textoFormado.getBytes(“Windows-1252”),“UTF-8”);

几乎所有String都被正确解码。但是有一些信件不是。

例如:

  1. 我从数据库收到此字符串:“ vila”
  2. 我使用上面的代码,这使得这个字符串:“ ?vila”
  3. 我期待这个字符串:“Ávila”

3 个答案:

答案 0 :(得分:8)

显然,textoFormadoString类型的变量。这意味着字节已经被解码。然后,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

答案 1 :(得分:0)

我感谢所有人解决了它。

我有下一个项目结构

  • MyBatisQueries:我有一个带有“select”的查询,它为我提供了字符串
  • 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;
        }
    }

}

答案 2 :(得分:0)

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

大多数 JDBC connection-string 或 URI 支持属性 characterEncoding

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

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

另见: