2016-08-03 10 views
-2

名前の表示に関する問題が発生しました。私のアプリケーションは、PHP、Perl、BI Pentahoなど、さまざまなテクノロジーを使用しています。値をUTF-8に変換する際の問題

私はDBとしてMYSQLを使用しており、私のテーブルはCHARSET=utf8です。

マイテーブルは

Row1 = Ãx—350 
Row2 = Ñz–401 

PHPとPerlがDBに格納されている上記の値を変換する組み込み関数で異なるを使用して間違っている以下のように行の値が格納されていると、それは、UIに表示される

これは以下のように私は、レポートのデータを表示する前にデータを変換するETLを使用していますPentahoのを使用しているレポートに来て正しい

Expected Row1 = Áx—350 
Expected Row2 = Ñz–401 

です。 DB上に格納された値を変換するために、私は

new java.lang.String(new java.lang.String(CODE).getBytes("Windows-1252"), "UTF-8") 

以下のようにJavaの工程を経てデータを変換しようとしています。しかしそれだけで行2値がきている上記2つの間違った値のうち、適切な値に変換されていません正しく変換が、最初行1は誤って以下のように変換され

Converted Row1 = �?x—350 
Converted Row2 = Ñz–401 

例えば行1値が適切に変換する必要があるように、私は適切な値に変換することができますどのような方法を提案して下さいÁx-350になります。

Iは、上記のコードの出力は

Input Get Bytes = [[email protected]157ee3e5 
Input Encoded = �?x—350-350—É1 
以下の通りである AX-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); 

から350列「AXA€を変換するために、以下のように小さなJavaプログラムを書い

実際に期待される出力がÁx-350の場合、出力を見ると文字列が間違っています。

符号化/復号化にスキームIは、テストストリングonlineを試み、ストリングAXA€」350でテスト出力が正しいAX-350予想されることを確認します。

私は適切なエンコード/デコードスキームを使用していますが、javaコードが正しく変換できないことを指摘してください。

+0

実際の期待値はどうですか? "α-350"? UTF-8を正しく処理することができません。まず、http://stackoverflow.com/q/279170/476と[WebアプリケーションでUnicodeフロントを処理する](http://kunststube.net/frontback/)を参照してください。 – deceze

+0

ありがとう@deceze、はい期待値はÁx-350 – Yog

+1

変換するために使用しているコードはJavaScriptではなくJavaです。 – beasy

答えて

0

dbがutf-8に設定されていても、そのデータがutf-8(またはutf-8)に正しくエンコードされているとは限りません。 mojibake - 一度に間違ったエンコード方式でデコードされていた文字が間違ってエンコードされているように見えます。これを修正することは、過去のデコード/エンコードエラーを把握して元に戻すという、通常は面倒なプロセスです。

ロングストーリーショート:あなたがmojibakeを持っている場合、過去にどのようなコンバージョンが行われたか分かっていない(または把握できない)限り、自動コンバージョンはありません。

変換は最初にデコードしてからエンコードすることです。 Perlで変換する:

my $string = "some windows-1252 string"; 

use Encode; 
my $raw = decode('windows-1252',$string); 
my $encoded = encode('utf-8',$raw); 
+0

-functions.com/encodedecode.aspx)を入力したときに**†"350文字列をエンコード/デコード**としてEncodeとして** Windows - 1252 **とデコード** utf - 8 **結果は正しい私は新しいjava.lang.String(新しいjava.lang.String(CODE).getBytes( "Windows-1252")、 "UTF-8")ですが、 'エンコードして同じスキームでデコードしようとすると、私は望みの結果を得られません。助言がありますか ? – Yog

+0

私はJavaについてはわかりませんが、あなたのJavaコマンドが文字列を2度エンコードしていると確信しています。それは決して解読されない。 Perlでのデコードとエンコードの方法を示すために私の答えを編集しています – beasy

関連する問題