2012-01-25 12 views
4

私はAndroidを使って書かれたクライアント/サーバアプリケーションを持っていますが、私は解析と作成を行うためにアンドロイドにバンドルされた標準org.jsonパッケージクラスを使用しています。Json.org Androidに奇妙な文字を追加する

私は(その大きいので、ないフル1)右例えば生成JSON文字列の途中で、サーバー側で表示される変な文字を取得してきた

:あなたが見ることができるように

{!lo":"es_MX","id":2791884,"os":"8"} 

(!)感嘆符は、二重引用符の代わりにランダムに表示されます。私はまた、他のランダムな文字が中央の文字列に表示されます。それは非常に奇妙です。

ここでJSONオブジェクトを作成するコードはここ

JSONObject jsonObject = new JSONObject(); 
jsonObject.put("key", someValue); 

が送信するコードです... ..です

HttpPost type = new HttpPost(<server url here>); 
List<NameValuePair> params = new ArrayList<NameValuePair>(); 
params.add(new BasicNameValuePair("v", jsonObject.toString())); 
type.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
httpClient.execute(type); // This is a DefaultHttpClient 

私はランダムと言うが、この正確な位置にある感嘆符多くのエラーで一貫していますが、毎回ではありません。このエラーが発生するメッセージは約5件あり、1日当たり数万件にのぼります。そして、通常、jsonに挿入された値の内容ではなく、メッセージの構造を定義する文字(上記の引用符文字など)。これは、文字セットの問題ではないことを示唆しています。

誰かがこれを見かけますか?

+2

JSONを生成するコードを投稿できますか? –

+0

JSON規則に従って、サーバー側からJSON文字列が整形式に構築されていることを確認できますか? – MKJParekh

+0

これはほぼ確実にキャラクタセットやエンコードの問題です。クライアント、サーバー、および転送中に、コンテンツのエンコードと文字セットが同じであることを確認する必要があります。 – Jonathan

答えて

-1

(Log.dなどを使用して)クライアントでjsonを印刷し、サーバーに送信する前に奇妙な文字が含まれていないかどうかを確認します。

+0

根本的な原因を見つけ出す必要があります。回避策ではありません。文字列に奇妙な文字が含まれていた場合、どうすればいいですか? –

0

他の形式の文字列を作成していて、別の形式のテキストデコードを受け取っているようです。 iso to utfのようです。

0

送信者がcharacter setを正しく設定していないようです。スペイン語は、通常のASCIIまたはほとんどのWindowsエンコーディングに存在していないシンボルは、あなたがUTF-8を使用する必要があります:あなたは(read more)を使用しているどのHTTP交換を知らず

Content-Type: text/html; charset=utf-8

を、与えることはできません問題を解決するためのコードスニペットを正確に記述することができますが、それは簡単に把握できるはずです。

+0

私はすでに要求に対してUTF-8を指定していることを確認できます。上記の改訂された質問を参照してください。 –

+0

@Amorgos:(ここから推測する)フォームの内容だけでなく、* HTTPリクエスト*文字セットをUTF-8に設定していますか?ここで生のHTTPリクエストテキストを投稿できる場合は役に立ちます。 –

0

あなたは情報が不十分です。あなたの問題を解決するためのラジカル方法は、単にすべてを置き換えている(!)の文字( ")へ。

string.replaceAll("!", "\""); 

私はそれがサーバ側の問題ですね。

+0

潜在的な回避策ですが、非常にハッキーです! –

+0

ラジカル法^) –

0

私もsimmilar問題を抱えていた。私はに多くを書いてみましょう私のサーバはjson形式でデータを返していましたが、私の問題はąśćのような特別な文字と結びついていましたので、json_encode()はサーバからこの場合は文字列のテキストをnullとして返します。 私は知っています!私はmysql_query('SET CHARACTER SET utf8');をデータベースからのアイテムのために追加しました。これにより、特別な発音区別文字でサーバから文字列を取り出すことができました。

アプリサイトでは、GETメソッドでサーバーからデータを取得していました。最初に結果データをInputStreamに保存していました。それから私はInputStreamReaderにそれを詰め込みました。バイトごとにstringBuilderに追加していました。準備ができたテキストはtoString()文字列で変換されました。それから私はそれをnew JsonArray(readyString)に入れていました。しかし、私はjsonのテキストの一部が奇妙な文字を持っていることを発見しました。特に、żóćのような特殊文字があったその場所では。例えば、"description":"aaa"は "descriptionPffa"を投げていました: "aa" null: `。

データから結果を変換する別の方法を試してみることにしました。サーバーからデータを変換していた場所では、以下の方法を使用しました。最後に、wgen私はnew String(byteArray)に変更し、何とかそれはnew JsonArray(new String(byteArray))と働いたbyteArrayOutputStreamオブジェクトを得ました!

public class Streams { 
    public static byte[] getBytes(InputStream is) { 
     int len; 
     int size = 1024; 
     byte[] buf = new byte[0]; 

     try { 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      buf = new byte[size]; 
      while ((len = is.read(buf, 0, size)) != -1) 
       bos.write(buf, 0, len); 
      buf = bos.toByteArray(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return buf; 
    } 
}