更新情報
こんにちは、トランスネットの泉です。
先日、当サイトの「Ruby on Rails海外事情コラム」にて「Railsアプリで日本のemojiを広めませんか。」を公開いたしました。
かつてRailsで「絵文字」を扱うためには若干のテクニックが必要でしたが、最近は比較的簡単に扱えるようになってきました。

enjoy Railsway 第6回は、実際にRailsで絵文字を扱う方法をご紹介します。

 

データベースでutf8mb4を使用する

先のコラムの通り、絵文字を扱うためにはutf8mb4という文字コードを使用します。
そのため、データベースがこのutf8mb4を扱えることが必要になります。
今回はMySQLを利用することにします。
(MariaDBでも同じ手順を適用できます)
なお、バージョンが5.5.3より古い場合はutf8mb4に対応していませんのでご注意ください。
通常通り、データベースを指定してRailsアプリケーションを生成します。
アプリケーション名、その他のオプションは適宜指定してください。
$ rails new ./ -d mysql
生成できましたら、config/database.ymlを編集します。
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: 5
  username: root
  password:
  socket: /var/lib/mysql/mysql.sock
view rawdatabase.yml hosted with ❤ byGitHub
encodingutf8mb4に変更します。
その他の項目については環境にあわせて適宜指定してください。
設定できましたら、データベースを作成します。
通常通り、rakeタスクを実行します。
$ rake db:create
mysqlクライアントから、データベースの文字コードを確認してみます。
データベース名は適宜読み替えてください。
mysql> SHOW CREATE DATABASE emojilog_development;

001

データベースのデフォルト文字コードとしてutf8mb4が指定されていることを確認できます。

rakeタスクを使わずにデータベースを作成する場合は、このようにDEFAULT CHARACTER SETを指定してください。

add_indexできない……!?

utf8mb4を設定した場合、1文字を表現するために最大4バイト利用されることになります。
これはutf8の最大3バイトより1バイト大きいことになりますが、このことを考慮しないと問題が発生することがあります。
たとえばインデックスの長さは上限があるため、次のようにlimitを指定していないstringに対してadd_indexしようとするとエラーが発生します。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :user_cdnull: false
      t.timestamps null: false
    end
    add_index :users:user_cd
  end
end
view rawcreate_users.rb hosted with ❤ by GitHub

== 20150716045251 CreateUsers: migrating ======================================
— create_table(:users)
-> 0.0158s
— add_index(:users, :user_cd)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE INDEX `index_users_on_user_cd` ON `users` (`user_cd`) /**/activerecord-4.2.3/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:305:in `query’

この問題を回避するためにはいくつかの方法がありますが、対象となるstringのlimitを設定する方法をおすすめします。
インデックスが必要になるような場合、おそらくデフォルト値255文字もの文字列は必要ないはずですので、適切なlimitを設定しましょう。

class CreateUsers < ActiveRecord::Migration
  def change
  create_table :users do |t|
  t.string :user_cdlimit: 32null: false
  t.timestamps null: false
  end
  add_index :users:user_cd
  end
end
view rawcreate_users.rb hosted with ❤ by GitHub
== 20150716045251 CreateUsers: migrating ======================================
— create_table(:users)
-> 0.0133s
— add_index(:users, :user_cd)
-> 0.0242s
== 20150716045251 CreateUsers: migrated (0.0376s) =============================

limitを設定することでadd_indexできるようになりました。

絵文字を利用

それでは、実際に絵文字を利用してみましょう。
……とはいえ、実はここまで準備できましたら以降は基本的に通常のRailsアプリケーションと開発と変わりません。
今回はScaffoldingを利用して、絵文字を含む文字列を保存して表示するアプリケーションを作ってみます。
Articleモデルにcontentとして保存することにします。
$ rails g scaffold articles content:text
忘れずにマイグレーションを実行してください。
$ rake db:migrate
準備ができましたら、サーバを起動して絵文字を入力できる端末からRailsアプリケーションにアクセスします。
画面が表示されましたら、New Articleから絵文字つきの文章を保存してみましょう。

保存した絵文字を確認できましたでしょうか。

 

絵文字の見え方

さて、保存した絵文字はどのように見えていますでしょうか。
同じ絵文字を様々な端末で表示してみました。

iPhone

002

Android(Xperia ZL2)

003

Android(Nexus)

004

PC(Windows8.1+IE11)

005

違う端末でも同じような絵文字が表示されますが、完全に同じではありません。
また、今回の例ではiPhone以外の端末では国旗が文字として表示されてしまいました。
Railsアプリケーションとしては絵文字を扱えるようになりましたが、こういった特性があることを覚えておく必要があります。

まとめ

Railsでemoji(絵文字)を扱う方法をご紹介しました。
気をつけるところさえおさえておけば、それほど難しいことではありません。
モバイルファーストが進み絵文字を簡単に入力できる端末が増えている今、絵文字対応は軽視できなくなっています。
是非、みなさんのRailsアプリケーションにも絵文字を取り入れてみてください。
そして、emojiを広めていきましょう:-)

それでは今日はこの辺で。次回をお楽しみに♪

※今回の内容は以下で動作を確認していますが、動作を保証するものではありません

  • Ruby on Rails 4.2.3
  • MySQL 5.6.25
  • MariaDB 10.0.20