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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2682閲覧

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

Zan

総合スコア24

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/05/26 05:57

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

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

Swift

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

swift

1let text1 = Text() 2text1.emoji = "????" 3 4let text2 = Text() 5text2.emoji = "\u{1F441}" 6 7try! realm.write { 8 realm.add(text1) 9 realm.add(text2) 10}

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

"\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/26 17:59

編集2016/05/27 04:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zan

2016/05/26 22: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 04: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) ``` 上記のようにコードポイントから文字列に変換すると良いと思います。
Zan

2016/05/28 03:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問