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

Ram*_*mon 3 java utf-8 windows-1252 utf8-decode

我从外部Microsoft SQL 2008数据库接收数据(我使用MyBatis进行查询).在理论上,我在"Windows-1252"上接收数据编码.

我用这段代码尝试解码数据:

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

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

几乎所有String都被正确解码.但是有一些字母没有.

例如:

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

See*_*ose 9

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

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

byte[] sourceBytes = getRawBytes();
String data = new String(sourceBytes , "Windows-1252");
Run Code Online (Sandbox Code Playgroud)

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

byte[] destinationBytes = data.getBytes("UTF-8");
// write bytes to destination file here
Run Code Online (Sandbox Code Playgroud)

  • 请使用`textoFormado.getBytes("Windows-1252")`.忘记UTF-8,它不适用于这种情况,你也没有正确使用它. (2认同)

Ram*_*mon 1

感谢大家,我解决了。

我有下一个项目结构:

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

解决方案:

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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)