代码之家  ›  专栏  ›  技术社区  ›  Alejandro RV

将UTF-8字符更改为Latin1 Java

  •  -2
  • Alejandro RV  · 技术社区  · 8 年前

    在我的项目中,我从数据库中读取字符串,由于权限的原因,在数据库中我无法进行任何更改。我在任何编码中取一个字符串,并将其更改为UTF-8,没有任何问题,例如:

    String countryName= "ESPAÑA";   //get from de DataBase in unkwon encode
    String utf8 = new String(myString.getBytes(), Charset.forName("UTF-8"));
    System.out.println(utf8); //prints -> ESPAÑA and it should be ESPAÑA
    

    我在页面中找到了许多方法,但它做的任何事情都是正确的。

    2 回复  |  直到 4 年前
        1
  •  2
  •   Dragonthoughts    8 年前

    如果您不知道原始字节的编码,则无法将其转换为已知形式。我为Unicode联盟写了一篇关于这个问题的论文。看见 Mapping Text in Unspecified Character Sets to Unicode as a Canonical Representation in a Hostile Environment

    此代码

    UTF-8可以支持全范围的Unicode字符(目前约为2^21)。拉丁语1只能支持2^8个字符。

        2
  •  -2
  •   Lothar    8 年前

    String#getBytes() 使用系统编码以字节形式返回文本。您需要的是一个包含每个字符值的字节数组,而不需要进行任何转换来保持UTF8编码。你可以打电话

    myString.getBytes("8859_1");
    

    String utf8 = new String(myString.getBytes("8859_1"), "UTF8");
    

    但这只是一个变通办法。之前应该做的是检查对数据库的访问,因为从数据库中选择数据时,数据应该以这种方式显示。作为第一个测试,使用一个普通的DB客户端,看看文本是否正确显示在其中。如果是这种情况,那么表正确地包含了数据,并且从数据库中检索数据时出现了问题。这可能是连接字符串中的字符集设置错误,或者您没有使用 resultset#getString() 以文本形式获取数据,但可能以字节数组的形式获取数据,并以错误的方式创建字符串。

    试着找出这个问题的根源并加以解决。那么你不需要像上面那样的黑客来获得正确的数据。

    推荐文章