私はUITextView
私が呼ぶものを持っていますmessageField
。その中のデータmessageField
はPOST
JSON形式でサーバーに送信されます。ユーザーが絵文字を入力すると、データをにエンコードするのに問題がありますJSON
。絵文字はUnicodeエンコーディングを使用していると思います。
絵文字をJSONにエンコードする方法はありますか?そして、JSONから絵文字に戻ってUILabel
?
私はUITextView
私が呼ぶものを持っていますmessageField
。その中のデータmessageField
はPOST
JSON形式でサーバーに送信されます。ユーザーが絵文字を入力すると、データをにエンコードするのに問題がありますJSON
。絵文字はUnicodeエンコーディングを使用していると思います。
絵文字をJSONにエンコードする方法はありますか?そして、JSONから絵文字に戻ってUILabel
?
以下のコードを使用して絵文字をエンコードします
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];
編集-2016-03-03 この回答は2011年に作成されたものであり、もはや関連性がない可能性があることに注意してください。
絵文字は、特定のユニコードコードポイントをレンダリングするために使用される特定のフォントです。iOSは、絵文字固有のコードポイントにUnicode私用領域の1つを使用します。これらの「文字」を絵文字として表示する唯一の方法は、絵文字フォントと、デフォルトのテキストフォント(Helveticaなど)から絵文字フォントに切り替える方法を知っているマシンを用意することです。
JSONをどのようにエンコードしているかはわかりませんが、絵文字は単なるテキストであるため、UTF-8やUTF-16などのUnicode対応形式でテキストを転送する限り問題はありません。サーバー側またはデータベースには表示されませんが(前の前提条件でデータを表示しない限り)、同じrawバイトを送り返すことができ、同じように見えるはずです。
もう少し役立つかもしれないいくつかの投稿があります:
私は何時間も掘った後、同じ問題を抱えていました、そして最終的に私のために働くこの答えを見つけました: https ://stackoverflow.com/a/8339255/1090945
サーバーとしてレールを使用している場合は、これで十分です。ios / xcodeで何もする必要はありません。サーバーに、UTF8/16エンコーディングを実行せずにNSStringを渡すだけです。
Postegreはコードを正しく保存します。json:@messageをレンダリングすると仮定すると、json応答をiOSクライアントに送り返すときに、jsonエンコーディングに問題が発生します。
簡単なテストを行うことで、Railsコンソールでjsonエンコーディングの問題が発生しているかどうかをテストできます。
test = {"smiley" => "u {1f604}"} test.to_json
「{\"smiley\":\ "\ uf604 \"}」が出力される場合(1が失われていることに注意してください)、この問題が発生しています。リンクからのパッチはそれを修正します。
@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で完璧に動作します
絵文字で注意すべきことの1つ-jsonエンコーダーがASCII出力を生成するように設定されている場合(つまり、\ u <4桁の16進数>文字形式を使用する場合)、一部の絵文字文字は2バイトを超えるため、壊れてしまいます。許可されている4桁の16進数に収まります。
したがって、たとえばPythonでは、必ず次を使用してください。
json.dumps(<object containing emoji strings>, ensure_ascii=False)
SwiftとObjectiveCを更新する
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にデコードする必要はありません。アップルのドキュメントによると、5つのエンコーディングをデコードするためです。
データは、JSON仕様にリストされているサポートされている5つのエンコーディング(UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE)のいずれかである必要があります。データにはBOMがある場合とない場合があります。解析に使用する最も効率的なエンコードはUTF-8であるため、このメソッドに渡されるデータのエンコードを選択できる場合は、UTF-8を使用してください。