JAVA正在尝试将包含ISO-8859-1编码的字符串转换为UTF-8,但文件为UTF-8

JAVA正在尝试将包含ISO-8859-1编码的字符串转换为UTF-8,但文件为UTF-8,java,utf-8,character-encoding,iso-8859-1,Java,Utf 8,Character Encoding,Iso 8859 1,我不知道这是否有意义,但这就是我所理解的 我正在使用Eclipse对我的所有文件使用UTF-8编码。在其中一个示例中,我需要将字符串从ISO-8859-1转换为UTF-8。但是,该字符串是在文件本身中形成的(不是来自输入),这就是为什么我认为我的字符串以UTF-8开头,并且转换没有按照我预期的方式进行 字符串原始内容为: ||3.2|2013-01-25T17:24:00|ingreso|PAGO EN UNA SOLA EXHIBICION|6386.21|MXN|7408.00|No ide

我不知道这是否有意义,但这就是我所理解的

我正在使用Eclipse对我的所有文件使用UTF-8编码。在其中一个示例中,我需要将字符串从ISO-8859-1转换为UTF-8。但是,该字符串是在文件本身中形成的(不是来自输入),这就是为什么我认为我的字符串以UTF-8开头,并且转换没有按照我预期的方式进行

字符串原始内容为:

||3.2|2013-01-25T17:24:00|ingreso|PAGO EN UNA SOLA EXHIBICION|6386.21|MXN|7408.00|No identificado|NAUCALPAN DE JUÁREZ, ESTADO DE MEXICO|CAOS640116HT5|OSCAR MARTIN CARRERA|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JUÁREZ|ESTADO DE MEXICO|MÉXICO|53100|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JUÁREZ|ESTADO DE MEXICO|MÉXICO|53100|Persona Física con Actividad Empresarial|BAÑ930616R66|BAÑOMOBIL, S.A. DE C.V.|Av. 1° de Mayo|197|San. Lorenzo|TLALNEPANTLA DE BAZ|ESTADO DE MEXICO|MÉXICO|54047|1|NO APLICA|Dominio .com|Dominio por 1 año www.sanitariosportatiles.com|586.21|586.21|1|NO APLICA|Hospedaje 2 Gb|Hospedaje 2 Gb por 1 año www.sanitariosportatiles.com|5800.00|5800.00|IVA|16.00|1021.79|1021.79||
哪种原始编码应该是ISO-8859-1,当我将其转换为UTF-8时,它应该生成

||3.2|2013-01-25T17:05:06|ingreso|PAGO EN UNA SOLA EXHIBICION|6386.21|MXN|7408.00|No identificado|NAUCALPAN DE JUÃREZ, ESTADO DE MEXICO|CAOS640116HT5|OSCAR MARTIN CARRERA|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JUÃREZ|ESTADO DE MEXICO|MÉXICO|53100|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JUÃREZ|ESTADO DE MEXICO|MÉXICO|53100|Persona Física con Actividad Empresarial|BAÑ930616R66|BAÑOMOBIL, S.A. DE C.V.|Av. 1° de Mayo|197|San. Lorenzo|TLALNEPANTLA DE BAZ|ESTADO DE MEXICO|MÉXICO|54047|1|NO APLICA|Dominio .com|Dominio por 1 año www.sanitariosportatiles.com|586.21|586.21|1|NO APLICA|Hospedaje 2 Gb|Hospedaje 2 Gb por 1 año www.sanitariosportatiles.com|5800.00|5800.00|IVA|16.00|1021.79|1021.79||
这正是我所需要的,但我没有做到

这就是我迄今为止所尝试的

    String input = null;
    input = "||3.2|2013-01-25T17:24:00|ingreso|PAGO EN UNA SOLA EXHIBICION|6386.21|MXN|7408.00|No identificado|NAUCALPAN DE JUÁREZ, ESTADO DE MEXICO|CAOS640116HT5|OSCAR MARTIN CARRERA|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JUÁREZ|ESTADO DE MEXICO|MÉXICO|53100|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JUÁREZ|ESTADO DE MEXICO|MÉXICO|53100|Persona Física con Actividad Empresarial|BAÑ930616R66|BAÑOMOBIL, S.A. DE C.V.|Av. 1° de Mayo|197|San. Lorenzo|TLALNEPANTLA DE BAZ|ESTADO DE MEXICO|MÉXICO|54047|1|NO APLICA|Dominio .com|Dominio por 1 año www.sanitariosportatiles.com|586.21|586.21|1|NO APLICA|Hospedaje 2 Gb|Hospedaje 2 Gb por 1 año www.sanitariosportatiles.com|5800.00|5800.00|IVA|16.00|1021.79|1021.79||";
    String intento1 = null, intento2 = null, intento3 = null;
    try {
        intento1 = new String(input.getBytes("ISO-8859-1"),"UTF-8");
        intento2 = new String(intento1.getBytes(), "UTF-8");
        intento3 = new String(input.getBytes(),"UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    System.out.println(intento1);
    System.out.println(intento2); 
    System.out.println(intento3);   
返回

||3.2|2013-01-25T17:24:00|ingreso|PAGO EN UNA SOLA EXHIBICION|6386.21|MXN|7408.00|No identificado|NAUCALPAN DE JU?REZ, ESTADO DE MEXICO|CAOS640116HT5|OSCAR MARTIN CARRERA|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JU?REZ|ESTADO DE MEXICO|M?XICO|53100|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JU?REZ|ESTADO DE MEXICO|M?XICO|53100|Persona F?sica con Actividad Empresarial|BA?930616R66|BA?OMOBIL, S.A. DE C.V.|Av. 1? de Mayo|197|San. Lorenzo|TLALNEPANTLA DE BAZ|ESTADO DE MEXICO|M?XICO|54047|1|NO APLICA|Dominio .com|Dominio por 1 a?o www.sanitariosportatiles.com|586.21|586.21|1|NO APLICA|Hospedaje 2 Gb|Hospedaje 2 Gb por 1 a?o www.sanitariosportatiles.com|5800.00|5800.00|IVA|16.00|1021.79|1021.79||
||3.2|2013-01-25T17:24:00|ingreso|PAGO EN UNA SOLA EXHIBICION|6386.21|MXN|7408.00|No identificado|NAUCALPAN DE JU?REZ, ESTADO DE MEXICO|CAOS640116HT5|OSCAR MARTIN CARRERA|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JU?REZ|ESTADO DE MEXICO|M?XICO|53100|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JU?REZ|ESTADO DE MEXICO|M?XICO|53100|Persona F?sica con Actividad Empresarial|BA?930616R66|BA?OMOBIL, S.A. DE C.V.|Av. 1? de Mayo|197|San. Lorenzo|TLALNEPANTLA DE BAZ|ESTADO DE MEXICO|M?XICO|54047|1|NO APLICA|Dominio .com|Dominio por 1 a?o www.sanitariosportatiles.com|586.21|586.21|1|NO APLICA|Hospedaje 2 Gb|Hospedaje 2 Gb por 1 a?o www.sanitariosportatiles.com|5800.00|5800.00|IVA|16.00|1021.79|1021.79||
||3.2|2013-01-25T17:24:00|ingreso|PAGO EN UNA SOLA EXHIBICION|6386.21|MXN|7408.00|No identificado|NAUCALPAN DE JU?REZ, ESTADO DE MEXICO|CAOS640116HT5|OSCAR MARTIN CARRERA|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JU?REZ|ESTADO DE MEXICO|M?XICO|53100|CTO. ORADORES 33|33|CD. SATELITE|NAUCALPAN DE JU?REZ|ESTADO DE MEXICO|M?XICO|53100|Persona F?sica con Actividad Empresarial|BA?930616R66|BA?OMOBIL, S.A. DE C.V.|Av. 1? de Mayo|197|San. Lorenzo|TLALNEPANTLA DE BAZ|ESTADO DE MEXICO|M?XICO|54047|1|NO APLICA|Dominio .com|Dominio por 1 a?o www.sanitariosportatiles.com|586.21|586.21|1|NO APLICA|Hospedaje 2 Gb|Hospedaje 2 Gb por 1 a?o www.sanitariosportatiles.com|5800.00|5800.00|IVA|16.00|1021.79|1021.79||
这不是我想要的

编辑1:当我从输入中获取字符串时,其中一个转换工作正常,但我需要它在文件中工作


编辑2:这基本上是我所需要的,但在java中,我认为最基本的问题是您的期望

如果我理解正确,您希望能够通过更改字符编码将
Á
更改为
Ã
。这不可能发生。这些是不同的特征;i、 e.不同的代码点-
Á
为Unicode代码点00C1(或ISO-8859-1中的C1),而
Á
为00C3/C3

因此,当您将ISO-8859-1中的
Á
转换为Unicode到UTF-8时,您应该得到完全相同的字符
Á
。如果你不这样做,那么翻译就会被破坏

您还希望
MÉXICO
转换为
MÃbillion.XICO
。。。这对我来说太奇怪了。也许在你把这些角色转录成问题时有问题

现在,如果你的语言/地区的词典编纂规则说
Á
Ã
实际上是等价的,那么将其“规范化”为首选形式是合理的。然而,字符编码/解码的角色并不是进行这种与语言环境相关的翻译。你需要自己编写代码。。。或者找其他的图书馆



在字节级乱搞(用一个字符集编码,用另一个字符集解码)并不能“修复”这个问题。如果有什么问题的话,那会让事情变得更糟。您的混乱正在生成无法映射到目标编码方案的字节序列。。。因此有了问号。

当从二进制表示加载任何数据时,您必须知道该表示使用了什么编码才能对其进行解释或解码。如果您假定编码错误,那么您可能会得到垃圾——这是毫无意义的

为了从二进制数据构造字符串,必须指定源数据的编码。否则您可能会得到垃圾——构造的字符串可能不包含源数据中表示的字符

更具体地说,对于您的情况,如果您尝试使用ISO-8859-1编码加载UTF-8数据,您可能会收到垃圾。我之所以说“可能”,是因为这两种编码实际上有很多重叠:低127个代码点(如果我没记错的话)。如果仅使用这些低127码点,解码实际上可能“工作”,但由于不能保证这一点,因此不应依赖它

如果您告诉Eclipse使用UTF-8对源文件进行解码,那么您应该只使用能够使用UTF-8编码并配置为使用UTF-8编码进行编辑的编辑器来编辑这些源文件


还有一点:Java中字符串数据的内部表示是UTF-16。因此,说您的字符串“包含ISO-8859-1编码”是不正确的。如果你有一个字符串,你总是有UTF-16数据。数据是否正确取决于您是如何构造字符串的,如上所述。

我最终得到了它,以显示我在问题中指定的方式,我只是使用了错误的字符集

intento2 = new String(input.getBytes(Charset.forName("UTF-8")), Charset.forName("Windows-1252"));

这显示了我需要它的方式

简单地说,如果要将charset=iso-8859-1转换为java字符串(默认情况下为UTF-8)


我不相信Java中字符串数据的内部表示是UTF-8.Ergh。我的错。它们是UTF-16.:)但是是的,它们不是ISO-8859-1。有没有一种方法可以用不同的编码来声明字符串?我重复一下:Java字符串在内部是UTF-16。从字符数据构造Java字符串时,可以指定用于转换为内部UTF-16编码的编码。您可能希望将所有本地化字符串放在单独的数据文件中(而不是粘贴到Java源文件中),然后在运行时加载该数据文件,使用与创建/编辑文件相同的编码。查看java.util.Properties,了解在文件中存储键/值对的便捷方法。加载文件时,请使用允许您指定要使用的编码的读取器。例如:新的InputStreamReader(新文件InputStream(文件),“ISO-8859-1”)。出于部署目的,将数据作为资源而不是文件加载可能会更容易。问题是,当我从输入源获取数据时,就像将数据粘贴到命令行而不是在文件中声明数据一样,我确实获得了所需的结果。我知道我需要实现的东西看起来很奇怪,但这是另一个服务的要求,这就是为什么我需要它以这种方式运行,我认为字符集编码和解码可以做到这一点,并且在某种程度上可以做到(我只通过输入源实现)但是我无法从文件中完成这项工作。@alexhg11-我相信您将不得不编写Java代码来根据您的要求翻译单个字符。(但是,
MÉXICO
的翻译是真的吗?在我的浏览器中看起来很奇怪)显然,这对我来说也太奇怪了,但这就是Web服务所要求的,这就是我遇到的问题:/。我该怎么做呢?我必须在比亚迪做吗
 String response= new String(input.getBytes("ISO-8859-1"),"UTF-8");