0

ここに画像の説明を入力私は一日中問題の解決策を見つけようとしてきましたが、成功しませんでした. 私はまだOBjective Cに慣れていないので、おそらく何かばかげていることを知っているので、私の問題をここに示します。

ユニコードの絵文字を UILabel に実装しようとしています。それでは、1 歩ずつ進めていきましょう。

私が使用しているJson文字列は次のとおりです。

"body":"\\U0001f61f \\U0001f62e \\U0001f621"

ご覧のとおり、Json Serializer im を使用して unicode をエスケープしています。これが私の主な問題だと思います。

私は次のようにデータを取得しています:

  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    NSString *concat=[NSString stringWithFormat:@"MYURL?ID=%@",_TID];
    NSURL *url = [NSURL URLWithString:concat];
    NSData *jsonData=[NSData dataWithContentsOfURL:url];

    dispatch_async(dispatch_get_main_queue(), ^{
        if (jsonData!=nil) {
            newX= [[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil]mutableCopy];
            pageCounter=2;
            [self.topicView reloadData];
            [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;            }
        [loadingView
         performSelector:@selector(removeView)
         withObject:nil
         afterDelay:1];
    });
});

しばらくすると、データが呼び出されて UILabel に追加されます。

UILabel *emo=(UILabel*)[Tcell viewWithTag:6];
   NSString*body=[[[newX objectAtIndex:indexPath.row] valueForKey:@"body"] mutableCopy];
   emo.text=body;

\U0001f61f \U0001f62e \U0001f621 がテキストとして表示されます。おそらく単なるエンコーディングの問題であることはわかっていますが、これを攻撃する場所がわかりません。

どんな助けでも大歓迎です。:)

4

4 に答える 4

1

json 文字列が "\U0001f61f" の場合、json は\\リテラル スラッシュを表すエスケープとして理解します。「U」と 16 進数自体をエスケープする場合は、スラッシュを 1 つだけ使用してください。


次のような文字列を作成すると:

NSString *s = @"\U0001f61f \U0001f62e \U0001f621";

\UObjective-C コンパイラがエスケープ (C および C++ からの汎用文字名と呼ばれる) を理解し、文字列リテラル内の適切な文字に変換するため、絵文字を取得できます。json からの文字列、plist、または文字列リテラル以外のものを使用する場合、エスケープ シーケンスは、Objective-C コンパイラによってコンパイル時に処理されません。


注:文字列リテラルのエスケープが Objective-C または Objective-C++ でどのように処理されるかについては、C または C++ 言語仕様を参照してください。


代わりに、json が理解するエスケープを使用して json で文字列を作成します。残念ながら、json は、BMP 以外の文字 (つまり、U+FFFF より大きい文字) に対する Unicode サポートが不十分です。json には\uエスケープがありますが、16 進数 4 桁しかサポートされていません。これを BMP 以外の文字で使用するには、UTF-16 と同じようにサロゲート コードポイントを使用するハックがあります。

必要な文字をエンコードする json 文字列は次のとおりです。

"body":"\uD83D\uDE1F \uD83D\uDE2E \uD83D\uDE21"

(Google を使用して、フォーマット U+123456 を使用して Unicode 文字を検索すると、UTF-16 エンコーディングを示すページが見つかります。)

これがあなたが行う必要がある唯一の変更であることを願っていますが、NSJSONSerializationこのハックがサポートされているかどうかはわかりません. NSJSONSerializationこれだけではうまくいかない場合は、json データから文字列データを生成する方法について、(動作が文書化されていると仮定して) ドキュメントを参照する必要があります。

于 2013-06-21T17:46:23.397 に答える
0

これらの文字を表示するには、有効なフォントを使用する必要があります。iOS では、Apple Color Emojiフォントを使用することを意味します。

于 2013-06-20T19:31:30.687 に答える