質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

Realmに登録したunicode情報を使用し、絵文字を表示させる

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,517

Zan

score 24

Swiftで作成したアプリ上の所定の位置に、絵文字を表示するプログラムを作成しようとしています。

具体的にはRealmで作成したDBに、絵文字を表すunicode(例えば「\u{1F441}」)情報を登録し、以下のコードでそれを呼び出すことで表示させようとしていますが、絵文字ではなく「\u{1F441}」という文字列自体が表示されてしまいます。

self.emaEmoji.text = results[recordNum].emoji


以下のようにベタ打ちで指定した場合は正常に絵文字が表示されます。
self.emaEmoji.text = ”\u{1F441}”

また、print(results[recordNum].emoji)で中身を表示されると、「\u{1F441}」という文字列が表示されます。

絵文字を正常に表示するにはどうすべきかご教示ください。
よろしくお願いします。

※絵文字情報は以下のページを参考にしています。
Full Emoji Data

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

絵文字ではなく、"\u{1F441}"といったテキストがそのまま入ってしまっています。Realmに値を保存するとき、特にモデルのプロパティにはどのように値を代入していますか?
推測ですが、ファイルなどに"\u{1F441}"といった文字列がそのまま書かれているのではないでしょうか?
Swiftにおける"\u{1F441}"という表現はStringリテラルの特別な形なので、リテラルでなければただの文字列として扱われてしまいます。

例えば、下記のように直接絵文字を代入するか、Stringリテラルとして"\u{1F441}"を代入すれば、絵文字として保存され、取り出すことができます。

let text1 = Text()
text1.emoji = "👁"

let text2 = Text()
text2.emoji = "\u{1F441}"

try! realm.write {
    realm.add(text1)
    realm.add(text2)
}

まず、絵文字の入力元がどうなっているかを教えてください。ファイルなどにコードポイントの数値がテキストで書かれている、というならその数値を適切に変換する必要があります。

"\u{1F441}"という表記はStringリテラルの特別な形なので、「リテラル(ソースコード中に数値や文字列を直接に記述した定数)」として書かれない限りはただの文字列です。

解決方法はいろいろありますが、簡単なのはCSVでは絵文字を直接使うことです。

どうしてもコードポイントの数値でCSVには書いておきたいということであれば、
\u{1F441}, \u{1F442}, ...という形ではなくて、1F441, 1F442, ...と数値のみをCSVに書く形にして、

let codePoint = Int(results[recordNum].emoji, radix: 16)!
let scalar = UnicodeScalar(codePoint)
let emoji = String(scalar)

上記のようにコードポイントから文字列に変換すると良いと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/27 07:04

    Realmを利用する際は以下のページの手順に従い、別途Excelで作成したcsvをrealmファイルに変換し、読み取り専用扱いでアプリに登録しています。
    http://qiita.com/shoya/items/7a8234c4dc32bc120250

    プロパティの定義は以下のように、
    dynamic var emoji:String = ""

    またcsv作成時の絵文字用のプロパティに関しては、以下のコードでデータを生成しています。
    let wordsDic = WordDic()
    wordsDic.emoji = line.componentsSeparatedByString(",")[10]

    試しに、csvファイルの所定の箇所のunicodeを書いていた箇所を「👁」」と置き換えると、アプリ上でも正常に👁が表示されました。

    また同じ場所に「"\u{1F441}"」と書くとアプリ上でも「"\u{1F441}"」が表示され、「\u{1F441}」と書くと「\u{1F441}」が表示され、仰る通り単なる文字列として扱われてしまっているのですが、何か変換作業が必要なのでしょうか。

    キャンセル

  • 2016/05/27 13:17

    思った通りですね。書いた通り、`"\u{1F441}"`という表記はStringリテラルの特別な形なので、「リテラル(ソースコード中に数値や文字列を直接に記述した定数)」として書かれない限りはただの文字列です。

    解決方法はいろいろありますが、簡単なのはCSVでは絵文字を直接使うことです。

    どうしてもコードポイントの数値でCSVには書いておきたいということであれば、
    `\u{1F441}, \u{1F442}, ...`という形ではなくて、`1F441, 1F442, ...`と数値のみをCSVに書く形にして、

    ```
    let codePoint = Int(results[recordNum].emoji, radix: 16)!
    let scalar = UnicodeScalar(codePoint)
    let emoji = String(scalar)
    ```

    上記のようにコードポイントから文字列に変換すると良いと思います。

    キャンセル

  • 2016/05/28 12:08

    ありがとうございます。ご紹介いただいたコードを使い、正常に絵文字を表示できるようになりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る