名前の表示に関するレポートで問題が発生しています。私のアプリケーションでは、PHP、Perl、および BI Pentaho 用にさまざまなテクノロジを使用しています。
DBとしてMYSQLを使用しており、私のテーブルはCHARSET=utf8
.
私のテーブルは、以下のように値が行に格納されていますが、これは間違っています
Row1 = Ãx—350
Row2 = Ñz–401
PHP と Perl は異なる組み込み関数を使用して、DB に保存されている上記の値を変換し、以下のように UI に表示されていますが、これは正しいです
Expected Row1 = Áx—350
Expected Row2 = Ñz–401
pentaho を使用しているレポートに来て、レポートにデータを表示する前に、ETL を使用してデータを変換しています。上記のDBに保存された値を変換するために、以下のようにJavaステップでデータを変換しようとしています
new java.lang.String(new java.lang.String(CODE).getBytes("Windows-1252"), "UTF-8")
しかし、値が正しく変換されていません。上記の 2 つの間違った値のうち、Row2 の値のみが正しく変換されていますが、最初のRow1は以下のように間違って変換されています。
Converted Row1 = �?x—350
Converted Row2 = Ñz–401
たとえば、Row1の値がÁx—350に適切に変換されるように、値を適切に変換する方法を提案してください。
以下のような小さな Java プログラムを作成して、 ×-350文字列を×-350に変換しました。
String input = "Ãx—350";
byte[] b1 = input.getBytes("Windows-1252");
System.out.println("Input Get Bytes = "+b1.toString());
String szUT8 = new String(b1, "UTF-8");
System.out.println("Input Encoded = " + szUT8);
上記のコードからの出力は次のとおりです
Input Get Bytes = [B@157ee3e5
Input Encoded = �?x—350-350—É1
出力が表示された場合、文字列が間違っており、実際に期待される出力はÁx—350です。
エンコーディング/デコーディングスキームを確認するために、オンラインで文字列をテストし、文字列× x-350 でテストしたところ、出力は予想どおり×x-350で、これは正しいものでした。
したがって、これから、適切なエンコード/デコードスキームを使用しているにもかかわらず、Javaコードが適切に変換できない理由、不足しているもの、または私のアプローチが間違っている理由を指摘してください。