Encode::JP::Emojiをつかってみて思ったこと

これはイイとおもって実践で使えるかどうか考えてる間に思ったことをつらつら書きます。

  • 相互変換する際に encode( 'x-sjis-e4u-kddi', decode( 'x-utf8-e4u-docomo', $str ) ) ってやるんだけど decode() でキャリアの指定が必要なようだ。
  • つまり$strがどのキャリアから入力されたものであるかを知ってないといけない。(Encode::JP::Mobileだと、そこをutf8とかでいける)
  • なるほど、$strをDBなどに持つ場合はキャリアのutf8の文字コードではなくGoogleが提案しているコードポイントでの保存することが前提のモジュールになっているようだ。
  • Googleの提案しているコードポイントはまだ正式にUnicodeに入ってないので、現時点でDBにGoogleのコードポイントのやつを保存するのはちょっと躊躇われるかも。


流れ的に正しいし便利だなーと思ったのですがUnicodeに入るのが前提かなぁ。
まぁ思い切ってGoogleのコードポイントでDBに入れちゃってもいいきもするけど。

実装みたらtrを使って置換してるんですね。すげー。


ということでもうちょっとGoogleUnicodeと絵文字を見守ってみたいと思います。

Encode::JP::Emojiでの相互変換

utf8(docomo)
↓
sjis(kddi)

ってやる方法は、

utf8(docomo)
↓ x-sjis-emoji-docomoでencode
sjis(docomo)
↓ x-sjis-e4u-docomoでdecode
utf8(google)
↓ x-sjis-e4u-kddiでencode
sjis(kddi)

のようにするので合ってるかな?かな?

つまりは相互変換するときはGoogleUTF-8を経由しないといけないということなんだろうか?

実際以下のコードだと動くのでそうなのかな。

use Encode::JP::Mobile;
use Encode::JP::Emoji;

my $kddi = "\xF6\x59";
my $docomo = "\xF9\xDC";

# Encode::JP::Mobile
warn $kddi eq encode( 'x-sjis-kddi-auto', decode( 'x-sjis-imode', $docomo ) ); # true

# Encode::JP::Emoji
my $docomo_str = decode( 'x-sjis-emoji-docomo', $docomo );
my $docomo_octet = encode( 'x-sjis-emoji-docomo', $docomo_str );
my $google_str = decode( 'x-sjis-e4u-docomo', $docomo_octet );
warn $kddi eq encode( 'x-sjis-e4u-kddi', $google_str ); # true

追記:
↓これでもできるようですね。

warn $kddi eq encode( 'x-sjis-e4u-kddi', decode( 'x-sjis-e4u-docomo', $docomo ) ); # true

emacs lispのshell-command-to-string()

shell-command-to-stringっていう関数は、渡された文字列をコマンドとしてログインシェルに渡すっぽい。

なのでtcshをログインシェルにしていて、下記のようなものを評価すると

(shell-command-to-string
 "perl -e 'print join(q{ }, grep( !/^\.$/, @INC));'"
 )
"/: Event not found.
"

エラーがでます。これは「!」がtcshでは特別な意味を持ってるから。
ログインシェルをbashzshに変えてやってみたら↑のは問題なく実行できました。