4

è¼å¥MySql から取得した Web サービス (php) によって返されるテキストが文字化けしました

Androidでutf-8にデコードしようとしていますが、機能していません

私が試してみました:

String s = "è¼å¥";// text returned by web service taking it as static for testing

1.機能しない:

String str = new String(s.getBytes(), "utf-8");

2.機能しない:

String normalized = Normalizer.normalize(str, Normalizer.Form.NFD);
// also tried NFC, NFKC, NFKD
// also tested by isNormalized its returning true 

3.機能しない:

String str =URLDecoder.decode(s, "utf-8");

上記のすべてが同じ出力を与えています:è¼å¥

だから、誰かが私が間違っていることを理解するのを手伝ってくれますか? または、代替案を教えてください。

どんな助けでも大歓迎です。ありがとう

4

3 に答える 3

8

Stephen Cが非常によく説明したように、私はそのすべての手順に従いましたが、追加の変更はほとんど必要ありません:

1. Stephen Cが説明したように、私のサーバーはデータを送信していたLatin-1 encodingので、使用する必要がありますISO8859_1 charset

2.私はしようとしていたString str = new String(s.getBytes(), "utf-8");

これはLatin-1 encodedデータには機能しません!

そのため、charset(私の場合 ISO8859_1)データをに設定する必要がありますgetBytes(" ISO8859_1")

だからこれは今うまくいっている

String str = new String(s.getBytes("ISO-8859-1"), "utf-8");

2 番目のパラメーターは新しい文字列の文字セット用であるためit must be utf-8、元のテキストを表示することに注意してください

于 2013-08-17T06:53:14.450 に答える
1

最初に行うことは、応答の Content-Type ヘッダーをチェックして、リモート サーバーが応答で使用していると言っているエンコーディングを確認することです。何も言わない場合は、UTF-8 ではなく ISO-8859-1 (別名 Latin-1) を使用している可能性があります。

もう 1 つの可能性は、サーバーがバイナリ データを送信しているということです。テキストとして表示しようとしてはいけません。

テキストがどのように見えると期待しているかを教えていただけると助かります。


Latin-1 テキストであると仮定すると、次のようにデコードする必要があります。

String str = new String(s.getBytes(), "ISO8859_1");

ここで実際にやろうとしているのは、バイトエンコーディングから、文字が効果的に UTF-16 で表現される Java のネイティブ String 表現に変換することであることに注意してください。


また、原文は漢字だとおっしゃっています。その場合、本当の問題はサーバー側にあると思います。Latin-1 は、漢字の有効なエンコードではありません。

したがって、サーバーがテキストを誤って保存し、その過程で文字化けを起こしているように見えます...そして、正しくない/不適切なエンコーディングタイプで提供しています。

なんて混乱!

于 2013-08-17T06:21:58.227 に答える
1

JavaコードでUTF-8文字を適切に取得する方法についてはコメントしていません。あなたはほとんどさまざまなことを試してきたので、そのうちの1つがあなたのために働くはずだと私は信じています. しかし、さまざまなコードの変更を正しく検証する方法について、お手伝いしたいと思います。

あなたのコメントに従ってOK

ログとトーストにも表示するsysoutsで印刷しています。コンソールには、既にテストしたテキストが表示されます。

これらの方法の問題点は、出力ソースが UTF-8 でエンコードされていることを確認する必要があることです。コンソールの問題は、デフォルトで UTF-8 エンコードされていないことです。したがって、コードでさまざまな方法を試しても、コンソールは UTf-8 データを正しく出力できず、コードを正しく検証することはできません。

Eclipse Android SDK を使用している場合は、コンソールのエンコーディングを変換する方法があります。方法は次のとおりです。

実行構成 -> 共通 -> エンコード (UTF-8 を選択)

于 2013-08-17T06:22:24.523 に答える