我从外部Microsoft SQL 2008数据库接收数据(我使用MyBatis进行查询)。在theroy中,我在“Windows-1252”上接收数据编码。
我尝试使用以下代码解码数据:
String textoFormado = ...来自MyBatis的值......;
String s = new String(textoFormado.getBytes(“Windows-1252”),“UTF-8”);
几乎所有String都被正确解码。但是有一些信件不是。
例如:
答案 0 :(得分:8)
显然,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
答案 1 :(得分:0)
我感谢所有人解决了它。
我有下一个项目结构:
起初我有(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
。
然后应该以指定的编码读取每个字符串列,而无需手动(重新)将其转换为它。
另见: