3

我不知道这是否有意义,但这就是我所做的。

我正在使用 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:这基本上是我需要的http://cryptosys.net/cgi-bin/manual.cgi?m=pki&name=CNV_UTF8FromLatin1但在 java

4

4 回答 4

9

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

 String response= new String(input.getBytes("ISO-8859-1"),"UTF-8");
于 2015-01-09T13:03:02.980 回答
4

我终于让它显示了我在问题中指定的方式,我只是使用了错误的字符集。

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

这以我需要的方式显示了它。

于 2013-01-30T23:59:40.133 回答
2

我认为这里的根本问题是您的期望。

如果我理解正确,您希望能够通过更改字符编码Á来更改。Ã那不可能发生。这些是不同的字符;即不同的代码点 -Á是 Unicode 代码点 00C1(或 ISO-8859-1 中的 C1)并且Ã是 00C3 / C3。

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

您还希望MÉXICO翻译为MÉXICO... 这对我来说似乎很奇怪。也许您将字符转录到问题中存在问题......

现在,如果您的语言/地区的词典规则说ÁtoÃ实际上是等效的,那么将“规范化”为首选形式是合理的。但是,进行这种与语言环境相关的翻译并不是字符编码/解码的作用。您需要自己编写代码......或找到其他一些库。


在字节级别搞乱(用一个字符集编码并用不同的字符集解码)不会“解决”这个问题。如果有的话,它会让事情变得更糟。你的乱七八糟正在生成无法映射到目标编码方案的字节序列......因此是问号。

于 2013-01-26T01:22:28.243 回答
0

从二进制表示加载任何数据时,您必须知道该表示使用什么编码才能解释或解码它。如果你假设错误的编码,那么你可能会得到垃圾——一些没有意义的东西。

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

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

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

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

于 2013-01-26T03:12:14.823 回答