Java编码字符串无法正确转换

时间:2016-06-04 16:39:21

标签: java character-encoding

我有几个字符串没有正确转换。我遇到的问题是我的所有字符串都有奇怪的字符(它们是带有顶部重音的西班牙语)并且我能够使用以下代码转换它们:

与DB的连接: 连接后我继续从DB获取信息如下(它带有json格式)数据库信息显示为Perú:

if (responseCode == HttpURLConnection.HTTP_OK) {
    InputStream in = new BufferedInputStream(urlConnection.getInputStream());

    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    //BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "iso-8859-1"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }
    result = sb.toString();
    //is.close();
    Log.i("Tag:", result);
}

检索JSON列表:

try{
    jArray = new JSONArray(welcome.result);
    for(int i=0;i<jArray.length();i++){
        JSONObject json_data = jArray.getJSONObject(i);
        Log.i("log_tag", "title:" + json_data.getString("title"));

        try {
            country = new String(json_data.getString("country").getBytes("ISO-8859-1"), "UTF-8");
        }
        catch (UnsupportedEncodingException e){

        }

然而,我用西班牙语抓住了另一根弦,它又回复了,但其他琴弦仍然正常显示。当前字符串看起来像PER ?º 有任何想法吗?我猜是使用不同的编码。我从中拉出它们的数据库使用utf8_general_ci。提前谢谢!

2 个答案:

答案 0 :(得分:2)

只需这样做:

country = json_data.getString("country");

getString已经返回String,因此无需将其编码为ISO-8859-1以将其解码为UTF-8,但由于显而易见的原因无效。

如果你使用上面的代码得到不正确的字符,这意味着你的问题出现之前,可能在解析你的JSON内容时,它可能没有使用正确的字符编码进行解析。

您需要将字符编码显式设置为UTF-8,否则将使用默认值作为下一个:

BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));

答案 1 :(得分:2)

试图理解你所展示的内容。

您说数据库显示Perú

CP1252中,即字节50 65 72 C3 83 C2 BA

UTF-8的字节为Perú

CP1252中,即字节50 65 72 C3 BA

UTF-8的那些字节是Perú&lt; ==正确值

看起来这里有一个双重不良编码。

一个错误的编码可能来自“数据库显示”,即如何查看数据库显示的内容?

其他不良编码是插入数据的人搞砸了。

我会假设该数据库实际上存储了UTF-8中的Perú。用于显示值的工具是错误的。当然,插入该值的人也是错误的,因此是双重错误。

解决方案:首先修复插入错误数据的代码。您还可以使用可以正确显示数据库中的内容的工具。

然后从Java代码中删除任何编码黑客,因为它很可能正确地执行它。或者至少,不是Java数据库的一部分代码是坏的。