Skip to content
miyucy edited this page Sep 13, 2010 · 4 revisions

メモ

基本的なこと

#!/usr/bin/ruby -wKU
$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
require 'e4u/encode'

$DEBUG = true

puts '-' * 80
E4U.encode('', :docomo, :sjis => :utf8)

puts '-' * 80
E4U.encode('', :docomo, :utf8 => :sjis)

puts '-' * 80
E4U.encode('', :sjis, :docomo => :kddi)

# >> ----------------------------------------
# >> docomo_cp932_to_docomo_unicode
# >> cp932_to_utf8
# >> docomo_unicode_to_docomo_utf8
# >> ----------------------------------------
# >> docomo_utf8_to_docomo_unicode
# >> utf8_to_cp932
# >> docomo_unicode_to_docomo_cp932
# >> ----------------------------------------
# >> docomo_cp932_to_docomo_unicode
# >> cp932_to_utf8
# >> docomo_unicode_to_google_unicode
# >> google_unicode_to_kddi_unicode
# >> utf8_to_cp932
# >> kddi_unicode_to_kddi_cp932

E4U::Encode.convert_(string, from, to)

from == toになるまで、再帰的に呼び出す。

やりたいこと

いろんなところでunicodeと書いてるけど、ncrに書き換えたい

ncr == numeric character reference == 数値文字参照
スペルあってる?

内部コードの変更

現在の内部コードをunicodeからutf8にしたい。
単純に &#xXXXX; の 8バイトを置換(gsub)するよりも UTF-8(3〜4バイト) を置換するほうが速いでしょ?

フォールバック指定

こんな感じ

# Google絵文字に相当しない絵文字はテキストにフォールバックする
E4U.encode(str, :google => :docomo, :utf8 => :sjis, :fallback => :text)

# Google絵文字に相当しない絵文字は
# <img src="http://mail.google.com/mail/e/docomo_ne_jp/000" alt="[晴れ]" class="e" />に変換
E4U.encode(str, :google => :docomo, :utf8 => :sjis, :fallback => :gmail)

# Google絵文字に相当しない絵文字は
# <img src="/images/emoticons/sun.gif" alt="[晴れ]" class="e" />に変換
E4U.encode(str, :google => :docomo, :utf8 => :sjis, :fallback => :typecast)

# Google絵文字に相当しない絵文字は
# ご自由に
E4U.encode(str, :google => :docomo, :utf8 => :sjis, :fallback => lambda{|utf8| '' })

http://search.cpan.org/~kawasaki/Encode-JP-Emoji-0.05/lib/Encode/JP/Emoji/FB_EMOJI_TEXT.pm を参考する

デフォルトオプションとか


E4U::Encode.default_fallback = :text
E4U::Encode.default_fallback = lambda{|utf8| ’’}

変換器指定

E4U::Encode.default_converter = :google
E4U::Encode.default_converter = :jpmobile

class MyConverter < E4U::Encode::Converter::Google
end
E4U::Encode.default_converter = MyConverter.new

RUBY_VERSION

  • if define? ::Encoding
  • if String.instance_methods.include? ‘encode’
  • if ’’.responde_to? :encode
  • if RUBY_VERSION > ‘1.8’

どれがいいの? 最近2chであれこれ議論してたけど
duck typing? chicken typing? 俺はstr.encodeしていることを確認したいから responde_to? するぜ?
好みの問題?

MRI18,MRI19,JRuby用nkfオプション

MRI19ならEncoding::Windows_31Jがつく(はず)
"-x" はCP932を指定することで暗黙のうちに指定されるのでおk1
JRubyは "-x""--ic""--oc" に対応してないけど、無視してくれるのでおk2

CP932UTF-8

NKF.nkf("-m0Sw --ic=CP932 --oc=UTF-8", STRING)

UTF-8 → CP932

NKF.nkf("-m0sW --ic=UTF-8 --oc=CP932", STRING)

1 いつから? 1.8.6? 1.8.7? むしろ害はないからつける?

2 http://github.com/jruby/jruby/src/org/jruby/RubyNKF.java