0

私は、JSONフィードの特殊文字(ブラウザーで表示すると完全に正常に見える)がAndroidコードで使用されたときに壊れてしまう理由を理解しようとしています。アクセント記号、省略記号、中引用符などの文字は、他の文字に置き換えられます。おそらく、UTF-8からASCIIに変換されますか?わからない。GETリクエストを使用してサーバーからJSONデータをプルし、解析してデータベースに保存し、Html.fromHtml()を使用してコンテンツをTextViewに配置しています。

4

1 に答える 1

1

多くの実験を行った後、問題がIgnition HTTPライブラリ(https://github.com/kaeppler/ignition)にあることがわかるまで、可能性を絞り込みました。具体的には、ignitedHttpResponse.getResponseBodyAsString()を使用します

これは便利なショートカットですが、その1行で文字が壊れます。代わりに、私は今使用します:

InputStream contentStream = ignitedHttpResponse.getResponseBody();
String content = Util.inputStreamToString(contentStream);


public static String inputStreamToString(InputStream is) throws IOException {
        String line = "";
        StringBuilder total = new StringBuilder();

        // Wrap a BufferedReader around the InputStream
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));

        // Read response until the end
        while ((line = rd.readLine()) != null) {
            total.append(line);
        }

        // Return full string
        return total.toString();
    }

編集:詳細を追加

これは、問題を再現するための最小限のテストケースです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    activity = this;

    instance = this;

    String url = SaveConstants.URL;
    IgnitedHttpRequest request = new IgnitedHttp(activity).get(url);
    InputStream contentStream = null;
    try {
    IgnitedHttpResponse response = request.send();

    String badContent = response.getResponseBodyAsString();
    int start = badContent.indexOf("is Texas");
    Log.e(TAG, "bad content: " + badContent.substring(start, start + 10));
    contentStream = response.getResponseBody();
    String goodContent = Util.inputStreamToString(contentStream);
    start = goodContent.indexOf("is Texas");
    Log.e(TAG, "good content: " + goodContent.substring(start, start + 10));
    } catch (IOException ioe) {
        Log.e(TAG, "error", ioe);
    }
}

ログ内:

悪いコンテンツ:テキサスです良いコンテンツ:テキサスです'</ p>

更新:私は気が狂っている、または問題はクライアントの本番フィードでのみ発生し、開発フィードでは発生しませんが、ブラウザで表示すると内容は同じに見えます-「テキサス」が表示されます。したがって、この問題を引き起こすには、おそらくいくつかの不安定なサーバー構成が必要です...それでも、この問題が発生した場合の修正は、概説したとおりです。response.getResponseBodyAsString();の使用はお勧めしません。

于 2012-06-22T15:08:09.273 に答える