株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

Oracle Database 12cのUnicode 6.1対応とEmoticons(顔文字)

Oracle Database は12c(12.1.0.1) よりUnicode 6.1に対応しています。日本における「文字」を考えると、Unicode 6.xにおける大きなトピックはいわゆる「顔文字」、Emoticons になるでしょうか。

というわけで動作を確認してみます。

Emoticonsのコード範囲とサロゲートポイント

Emoticonsに対応するコードポイントの範囲は、U+1F600からU+1F64Fです。 サロゲートペアを用いたUTF-16で表記すると0xD83D 0xDE00から0xD83D 0xDE4Fとなります。

コードポイント  サロゲートペア(UTF-16)    UTF-8
--------------- ------------------------- --------------------
1F600           0xD83D 0xDE00             0xF0 0x9F 0x98 0x80
1F64F           0xD83D 0xDE4F             0xF0 0x9F 0x99 0x8F

AL32UTF8のキャラクタセット定義を確認

Locale BuilderでAL32UTF8を開き、AL32UTF8のキャラクタセット定義を確認します。

locale_builder_AL32UTF8.jpg

分類が"PUNCTUATION" = 句読点 となっているのが気になりますが・・・。 一応、キャラクタセット定義には含まれているようです。

データを挿入

データベースキャラクタセットAL32UTF8のデータベース(Oracle Database 12.1.0.1) にデータをINSERTします。データは笑っている表情の顔文字とします。

      コードポイント  サロゲートペア    UTF-8
      --------------- ----------------- --------------------
笑    U+1F604         0xD83D  0xDE04    0xF0 0x9F 0x98 0x84

JIS X 0208 (JIS基本漢字) 以外の文字をOracle DatabaseにINSERTする場合は、unistr()を使用するのが、無用なトラブルを避けられるので便利です。

SQL> create table tab1 (i number, c varchar(80));

表が作成されました。

SQL> insert into tab1 values (1,unistr('\D83D\DE04'));

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> SELECT i, dump(c,17) FROM tab1;

         I
----------
DUMP(C,17)
------------------------------------------------------------------------------------------------------------------------
         1
Typ=1 Len=4: f0,9f,98,84

dump()の結果より、想定したUTF-8のバイト表現でデータが格納されていることがわかります。

データを確認

INSERTしたデータを確認します。

ツール、フォントなどがUnicode 6.0に対応していないと、適切に表示されません。

ツールは、Unicodeに対応しているSQL Developerを使用します。 JDKは、おそらくUnicode 6.0に対応しているJDK 7以降が良いはずです。

フォントは、VLゴシックを使用しました。 OS(Windows 7) にVLゴシック フォントをインストールしてから、SQL Developerの プリファレンスで表示用のフォントにVLゴシックを選択します。

sql_developer_pref_vlgothic.jpg

sql_developer_vlgothic_font.jpg

確かに笑っている表情の顔文字が表示されています!めでたしめでたし

補遺

原因まで追い切れていないのですが、いくつか表示できないケースがあったので共有しておきます。

フォントに和田研フォントを指定した場合、'・'のような文字が表示され、適切に表示されませんでした。和田研フォントのEmoticonsサポートに癖があるのかもしれません。

sql_developer_wadaken_font.jpg

SQL*Plusでデータを確認しても'?'となり表示できません。フォントをVLゴシックや和田研フォントを使用してもNGでした。もしかするとターミナルエミュレータ(Tera Term)の問題かもしれません。

SQL> SELECT c FROM tab1;

C
--------------------------------------------------------------------------------
?

2014/3/7追記: http://ttssh2.sourceforge.jp/manual/ja/usage/unicode.html "UTF-8は3バイトまでしか変換していない" とあるので、Tera TermはUnicodeのBMP範囲内のみの限定対応のようです。EmoticonsはBMP範囲外なので、上記の動作は想定されるものですね。

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ