web-dev-qa-db-ja.com

絵文字はJSONにエンコードできません

私はUITextViewと呼んでいるmessageFieldを持っています。そのmessageField内のデータはPOST- JSON形式でサーバーに送信されます。ユーザーが絵文字を入力すると、データをJSONにエンコードできません。絵文字はUnicodeエンコーディングを使用していると思います。

絵文字をJSONにエンコードする方法はありますか?そして、JSONから絵文字に戻ってUILabelに表示しますか?

13
janusfidel

編集-2016-03-03この回答は2011年に作成されたものであり、もはや関連性がない可能性があることに注意してください。

絵文字は、特定のユニコードコードポイントをレンダリングするために使用される特定のフォントです。 iOSは、絵文字固有のコードポイントにUnicode私用領域の1つを使用します。これらの「文字」を絵文字として表示する唯一の方法は、絵文字フォントと、デフォルトのテキストフォント(Helveticaなど)から絵文字フォントに切り替える方法を知っているマシンを用意することです。

JSONをどのようにエンコードしているかはわかりませんが、絵文字は単なるテキストであるため、UTF-8やUTF-16などのUnicode対応の形式でテキストを転送する限り問題はありません。サーバー側またはデータベースには表示されませんが(前の前提条件でデータを表示しない限り)、同じrawバイトを送り返すことができ、同じように見えるはずです。

もう少し役立つかもしれないいくつかの投稿があります:

10
Chris Haas

以下のコードを使用して絵文字をエンコードします

NSString *uniText = [NSString stringWithUTF8String:[textview.text UTF8String]]; 
NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 
NSString *goodMsg = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding] ;

そして、UILabelでデコードして表示する以下のコード

const char *jsonString = [body UTF8String]; 
NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)]; 
NSString *goodMsg = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding];
28
Karun

私は何時間も掘った後、同じ問題を抱えていました、そして最終的に私のために働くこの答えを見つけました: https://stackoverflow.com/a/8339255/1090945

サーバーとしてRailsを使用している場合は、これで十分です。ios/ xcodeで何もする必要はありません。UTF8/ 16エンコーディングを行わずに、NSStringを渡すだけです。サーバ。

Postegreはコードを正しく保存します。json:@messageをレンダリングすると仮定すると、json応答をiosクライアントに送り返すときに、jsonエンコーディングに問題が発生します。

簡単なテストとして、Railsコンソールでjsonエンコーディングの問題が発生しているかどうかをテストできます。

test = {"smiley" => "u {1f604}"} test.to_json

「{\ "smiley \":\ "\ uf604 \"}」が出力される場合(1が失われていることに注意してください)、この問題が発生しています。リンクからのパッチはそれを修正します。

4
lionel

@Karuに感謝します、あなたの応答を編集します、私はこのコードを使用します:

サーバーに送信するためのエンコード:

NSString *uniText = [NSString stringWithUTF8String:[text_to_send UTF8String]];

NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding];

NSString *str = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];

絵文字テキストを受信して​​表示するためにデコードします。

NSData *newdata = [received_string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

NSString *mystring = [[NSString alloc] initWithData:newdata encoding:NSNonLossyASCIIStringEncoding];

NSString *finalString= @"";

if (mystring) {
   finalString = mystring;
}else{
   finalString = received_string;
}

このコードはiOS9で完璧に動作します

4
Lito

絵文字で注意すべきことの1つ-jsonエンコーダーがASCII出力を生成するように設定されている場合(つまり、\ u <4 hex Digits>文字形式を使用)、一部の絵文字は壊れます2バイト以上を使用するため、許可されている4桁の16進数に収まりません。

したがって、pythonなどでは、必ず次を使用してください。

json.dumps(<object containing emoji strings>, ensure_ascii=False)
2
Richard

更新Swift&Objective C

JSONを介して絵文字アイテムを送信する場合は、最初にDBをUTF-8にフォーマットする必要があり、IOS NSUTF8StringEncodingにエンコードする必要があります。したがって、最初にDBフォーマットをUTFにフォーマットする必要があります。 -8は、パラメータをNSUTF8StringEncodingにエンコードします。したがって、メッセージを送信するときのサンプルリクエストを次に示します。

    let post:NSString = parameters!
    let url:NSURL = NSURL(string: serverURL!)!
    let postData:NSData = post.dataUsingEncoding(NSUTF8StringEncoding)! // Change Here
    let postLength:NSString = String( postData.length )
    let request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = postData
    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("*/*", forHTTPHeaderField: "Accept")
    return request

ただし、iOSではNSUTF8StringEncodingにデコードする必要はありません。Appleのドキュメントによると、5つのエンコーディングをデコードするためです。

データは、JSON仕様にリストされているサポートされている5つのエンコーディング(UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE)のいずれかである必要があります。データにはBOMがある場合とない場合があります。解析に使用する最も効率的なエンコードはUTF-8であるため、このメソッドに渡されるデータのエンコードを選択できる場合は、UTF-8を使用してください。

https://developer.Apple.com/library/ios/documentation/Foundation/Reference/NSJSONSerialization_Class/#//Apple_ref/occ/clm/NSJSONSerialization/JSONObjectWithData:options:error

1