3

これが理にかなっているのかどうかはわかりませんが、これが私が作ったものです。

すべてのファイルにUTF-8エンコーディングを使用してEclipseを使用しています。そのうちの1つでは、文字列を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:入力から文字列を取得すると、変換の1つは正常に機能しますが、ファイル内で宣言されて機能する必要があります。

編集2:これは基本的に私が必要とするものですhttp://cryptosys.net/cgi-bin/manual.cgi?m=pki&name=CNV_UTF8FromLatin1しかしjavaで

4

4 に答える 4

9

Simple Wordsで、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にトランスコードすると、まったく同じ文字が得られるはずÁです。そうしないと、翻訳が壊れてしまいます。

MÉXICOあなたはまた、翻訳することを期待してMÉXICOいます...これは私にはまったく奇妙に思えます。おそらく、質問への文字の書き起こしに問題があります...

さて、あなたの言語/地域の辞書編集規則が、ÁtoÃが実際に同等であると言っている場合、好ましい形式に「正規化」するのが合理的でしょう。ただし、このようなロケール関連の変換を行うのは、文字エンコード/デコードの役割ではありません。あなたはそれを自分でコーディングする必要があります...またはそれを行う他のライブラリを見つける必要があります。


バイトレベルでいじり回す(1つの文字セットでエンコードし、別の文字セットでデコードする)ことは、これを「修正」することにはなりません。どちらかといえば、それは事態を悪化させるでしょう。あなたのいじりは、ターゲットのエンコーディングスキームにマップできないバイトシーケンスを生成しています...したがって疑問符です。

于 2013-01-26T01:22:28.243 に答える
0

バイナリ表現からデータをロードする場合、データを解釈またはデコードするために、その表現に使用されているエンコーディングを知っている必要があります。間違ったエンコーディングを想定すると、おそらくガベージが発生します。これは意味がありません。

バイナリデータから文字列を作成するには、ソースデータのエンコーディングを指定する必要があります。そうしないと、ガベージが発生する可能性があります。構築された文字列には、ソースデータで表されている文字が含まれていない可能性があります。

具体的には、ISO-8859-1エンコーディングを使用してUTF-8データをロードしようとすると、ガベージが発生する可能性があります。これらの2つのエンコーディングには実際には多くの重複があるため、「可能性があります」と言います。つまり、127コードポイントが低い(正しく覚えている場合)。これらの低い127コードポイントのみが使用される場合、デコードは実際に「機能」する可能性がありますが、これは保証されていないため、信頼すべきではありません。

EclipseにUTF-8を使用してソースファイルをデコードするように指示している場合は、UTF-8エンコーディングを使用して編集できるように構成されたエディターを使用してのみこれらのソースファイルを編集する必要があります。

もう1つのポイント:Javaでの文字列データの内部表現はUTF-16です。したがって、「ISO-8859-1エンコーディングを含む」文字列があると言うのは誤りです。文字列がある場合は、常にUTF-16データがあります。そのデータが正しいかどうかは、前述のように、文字列をどのように作成したかによって異なります。

于 2013-01-26T03:12:14.823 に答える