Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将UTF-8字符更改为Latin1 Java_Java_Eclipse_Utf 8_Iso 8859 1 - Fatal编程技术网

将UTF-8字符更改为Latin1 Java

将UTF-8字符更改为Latin1 Java,java,eclipse,utf-8,iso-8859-1,Java,Eclipse,Utf 8,Iso 8859 1,在我的项目中,我从数据库中读取字符串,由于权限的原因,在数据库中我无法进行任何更改。我在任何编码中使用字符串,并将其更改为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

在我的项目中,我从数据库中读取字符串,由于权限的原因,在数据库中我无法进行任何更改。我在任何编码中使用字符串,并将其更改为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
我需要更改它,将所有解析为UTF-8的字符串转换为Latin1

我在页面中找到了许多方法,但都做得很正确。

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

myString.getBytes("8859_1");
所以代码中的行应该改为

String utf8 = new String(myString.getBytes("8859_1"), "UTF8");
但这只是一个解决办法。之前应该做的是检查对数据库的访问,因为从数据库中选择数据时,数据应该以这种方式显示出来。作为第一个测试,使用常规的DB客户机,查看文本是否正确显示在其中。如果是这种情况,那么表中正确地包含了数据,并且从数据库中检索数据时出现了问题。这可能是连接字符串中的字符集设置错误,或者您没有使用
resultset\getString()
将数据获取为文本,但可能是将其获取为字节数组,并以错误的方式创建字符串


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

如果你不知道原始字节的编码,你就不能将它们转换成已知的形式。我为Unicode联盟写了一篇关于这个问题的论文。看

此代码 新字符串(myString.getBytes(),Charset.forName(“UTF-8”) 意思是,我有UTF-8格式的字节,将它们转换成Java字符串

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

因此,从UTF-8到拉丁语-1的代码转换是危险的,因为一些字符将丢失,并且您将需要丢失字符异常处理


从Latin-1到UTF-8的代码转换很好,因为UTF-8支持所有Latin-1中的字符。

我不确定您是否理解该主题,或者我是否理解您。Java字符串只有一种合法形式(掩码下的unicode),字节可以容纳所需的代码页中的8位字符。如果没有数据库的详细信息,我想我们无法帮助您(即卖方)以及您配置它并连接到它的方式。如果DB/连接配置正确,您所做的应该是不必要的。问题不在于DB,因为我在一个简单的项目中也尝试了DB,我给出了字符串,但它不起作用。我只更改UTF-8中的一个字符串,带有类似ESPAÃ的字符“A,类似于ESPAñA的拉丁语1。它可能太像UTF-8字符替换为单独的拉丁语1字符。同意@StephenC。我想补充一点:如果你有一个java字符串对象,并且这个字符串显示错误的字符集解释已经完成,那么游戏已经结束了。有(一般情况下)再多的转换也无法恢复这种损坏(信息已经丢失)。因此,正如Stephen所说,我们应该首先看看是什么导致了损坏的字符串,并防止这种情况发生。旁注:无法更改字符的编码,因为字符在Java中是一个无编码的概念(至少在语言级别上).Char-to-byte转换(反之亦然)是编码发挥作用的地方。我想做的主要事情是将UTF-8字符串更改为拉丁文1。从ESPAÃa到ESPAña。但必须将所有UTF-8字符转换为拉丁文1字符。尽管很多人总是回答这个问题,
新字符串(foo.getBytes(encoding1),encoding2)
从未起过作用,不起作用,也永远不会起作用。但是,在大多数情况下,它会损坏字符串的内容。如果它没有损坏字符串,那就没有必要了。@Kayaman抱歉,但是如果UTF-8数据是以ISO-8859-1的形式读取的,那么你的说法就不是真的,这里的情况似乎就是这样。在这种情况下,我的解决方案非常有效,我我已经用过好几次来解决生产环境中的问题了。所以如果你是投票失败的原因,请考虑反转。我不会。正确的做法是正确地读取数据。当它已经被破坏时,不要试图修复它。如果你在生产环境中使用它,它真的不是。“这不是你想夸耀的地方。@Kayaman似乎直到最后你才读到答案,我明确地说,解决问题的根源比尝试我指定的解决方法要好。谢谢,这很有用。但事实上,我只想转换字母表中的主要字符,如下表所示:。我没有想象一下,我想要转换的字符串就足够了。我仍然强烈建议您尝试将所有字符串保持为Unicode格式,而不是尝试降级。您似乎已经决定要使用拉丁-1格式,但这意味着,如果将来任何时候,甚至有一个字符超出该设置,您的代码都将中断设计Java本机使用Unicode的原因是为了确保不会出现这些类型中断。这就是为什么万维网联盟的所有标准在很长一段时间内都默认使用Unicode编码,如UTF-8。