module Jpmobile::Emoticon

絵文字関連処理

Constants

AU_EMAILJIS_REGEXP
AU_EMAILJIS_TO_UNICODE
AU_SJIS_REGEXP
AU_SJIS_TO_EMAIL_JIS
AU_SJIS_TO_UNICODE
AU_UNICODE_TO_EMAILJIS
AU_UNICODE_TO_SJIS
CONVERSION_TABLE_TO_AU
CONVERSION_TABLE_TO_DOCOMO
CONVERSION_TABLE_TO_GOOGLE_EMOTICON
CONVERSION_TABLE_TO_PC_EMAIL

for PC conversion “GETA”

CONVERSION_TABLE_TO_SOFTBANK
CONVERSION_TABLE_TO_UNICODE_EMOTICON
DOCOMO_SJIS_REGEXP
DOCOMO_SJIS_TO_UNICODE
DOCOMO_UNICODE_TO_SJIS
EMOTICON_UNICODES
GETA
GETA_CODE
GOOGLE_EMOTICONS
GOOGLE_EMOTICON_REGEXP
GOOGLE_EMOTICON_TO_CARRIER_EMOTICON
GOOGLE_TO_AU_UNICODE
GOOGLE_TO_DOCOMO_UNICODE
GOOGLE_TO_SOFTBANK_UNICODE
SJIS_REGEXP
SJIS_TO_EMAIL_JIS

for au email

SJIS_TO_UNICODE
SOFTBANK_SJIS_REGEXP
SOFTBANK_SJIS_TO_UNICODE
SOFTBANK_UNICODE_REGEXP
SOFTBANK_UNICODE_TO_SJIS
SOFTBANK_UNICODE_TO_WEBCODE
SOFTBANK_WEBCODE_REGEXP
SOFTBANK_WEBCODE_TO_UNICODE
UNICODE_EMOTICONS

for unicode/google emoticons

UNICODE_EMOTICON_REGEXP
UNICODE_EMOTICON_TO_CARRIER_EMOTICON
UNICODE_TO_AU_UNICODE
UNICODE_TO_DOCOMO_UNICODE
UNICODE_TO_SJIS
UNICODE_TO_SOFTBANK_UNICODE
UTF8_REGEXP

Public Class Methods

emoticons_to_image(str) click to toggle source
# File lib/jpmobile/emoticon.rb, line 301
def self.emoticons_to_image(str)
  return str unless @pc_emoticon_hash

  utf8_to_unicodecr(str).gsub(/&#x([0-9a-f]{4});/i) do
    img = @pc_emoticon_hash[Regexp.last_match(1).upcase]
    unless img
      img =
        begin
          @pc_emoticon_hash[('%x' % (Regexp.last_match(1).scanf('%x').first - 0x1000)).upcase]
        rescue
          nil
        end
    end

    if img
      "<img src=\"#{@pc_emoticon_image_path}/#{img}.gif\" alt=\"#{img}\" />"
    else
      ''
    end
  end
end
external_to_unicodecr_au(str) click to toggle source

str のなかでau絵文字をUnicode数値文字参照に置換した文字列を返す。

# File lib/jpmobile/emoticon.rb, line 51
def self.external_to_unicodecr_au(str)
  str.gsub(AU_SJIS_REGEXP) do |match|
    sjis = match.unpack1('n')
    unicode = AU_SJIS_TO_UNICODE[sjis]
    unicode ? ('&#x%04x;' % unicode) : match
  end
end
external_to_unicodecr_au_mail(in_str) click to toggle source

str のなかでau絵文字をUnicode数値文字参照に置換した文字列を返す。(メール専用)

# File lib/jpmobile/emoticon.rb, line 60
def self.external_to_unicodecr_au_mail(in_str)
  str = Jpmobile::Util.ascii_8bit(in_str)
  str.gsub(Jpmobile::Util.jis_string_regexp) do |jis_string|
    jis_string.gsub(/[\x21-\x7e]{2}/) do |match|
      jis = match.unpack1('n')
      unicode = AU_EMAILJIS_TO_UNICODE[jis]
      unicode ? Jpmobile::Util.ascii_8bit("\x1b\x28\x42&#x%04x;\x1b\x24\x42" % unicode) : match
    end
  end
end
external_to_unicodecr_docomo(str) click to toggle source

str のなかでDoCoMo絵文字をUnicode数値文字参照に置換した文字列を返す。

# File lib/jpmobile/emoticon.rb, line 42
def self.external_to_unicodecr_docomo(str)
  str.gsub(DOCOMO_SJIS_REGEXP) do |match|
    sjis = match.unpack1('n')
    unicode = DOCOMO_SJIS_TO_UNICODE[sjis]
    unicode ? ('&#x%04x;' % unicode) : match
  end
end
external_to_unicodecr_google(str) click to toggle source

Google絵文字の変換

# File lib/jpmobile/emoticon.rb, line 113
def self.external_to_unicodecr_google(str)
  str.gsub(GOOGLE_EMOTICON_REGEXP) do |match|
    unicodes = match.unpack('U*')
    unicodes = unicodes.first if unicodes.size == 1

    emoticon = GOOGLE_EMOTICON_TO_CARRIER_EMOTICON[unicodes]
    case emoticon
    when GETA_CODE, nil
      # 〓が指定されているか変換できなければ〓に
      GETA
    when Integer
      '&#x%04x;' % emoticon
    when String
      emoticon
    end
  end
end
external_to_unicodecr_softbank(str) click to toggle source

strのなかでUTF8のSoftBank絵文字を(+0x1000だけシフトして)Unicode数値文字参照に変換した文字列を返す。

# File lib/jpmobile/emoticon.rb, line 72
def self.external_to_unicodecr_softbank(str)
  # SoftBank Unicode
  str.gsub(SOFTBANK_UNICODE_REGEXP) do |match|
    unicode = match.unpack1('U')
    '&#x%04x;' % (unicode + 0x1000)
  end
end
external_to_unicodecr_softbank_sjis(str) click to toggle source
# File lib/jpmobile/emoticon.rb, line 80
def self.external_to_unicodecr_softbank_sjis(str)
  # SoftBank Shift_JIS
  str.gsub(SOFTBANK_SJIS_REGEXP) do |match|
    sjis = match.unpack1('n')
    unicode = SOFTBANK_SJIS_TO_UNICODE[sjis]
    '&#x%04x;' % (unicode + 0x1000)
  end
end
external_to_unicodecr_unicode60(str) click to toggle source

Unicode 6.0絵文字の変換

# File lib/jpmobile/emoticon.rb, line 94
def self.external_to_unicodecr_unicode60(str)
  str.gsub(UNICODE_EMOTICON_REGEXP) do |match|
    unicodes = match.unpack('U*')
    unicodes = unicodes.first if unicodes.size == 1

    emoticon = UNICODE_EMOTICON_TO_CARRIER_EMOTICON[unicodes]
    case emoticon
    when GETA_CODE, nil
      # 〓が指定されているか変換できなければ〓に
      GETA
    when Integer
      '&#x%04x;' % emoticon
    when String
      emoticon
    end
  end
end
external_to_unicodecr_vodafone(str) click to toggle source
# File lib/jpmobile/emoticon.rb, line 89
def self.external_to_unicodecr_vodafone(str)
  external_to_unicodecr_softbank(str)
end
pc_emoticon?() click to toggle source
# File lib/jpmobile/emoticon.rb, line 284
def self.pc_emoticon?
  if @pc_emoticon_yaml && File.exist?(@pc_emoticon_yaml) && @pc_emoticon_image_path
    return true if @pc_emoticon_hash

    begin
      yaml_hash = YAML.load_file(@pc_emoticon_yaml)
      @pc_emoticon_hash = Hash[*(yaml_hash.values.inject([]) {|r, v| r += v.to_a.flatten; r })]
      @pc_emoticon_image_path.chop if @pc_emoticon_image_path.match?(%r{/$})

      return true
    rescue
    end
  end

  false
end
pc_emoticon_image_path() click to toggle source
# File lib/jpmobile/emoticon.rb, line 268
def self.pc_emoticon_image_path
  @pc_emoticon_image_path
end
pc_emoticon_image_path=(path) click to toggle source
# File lib/jpmobile/emoticon.rb, line 272
def self.pc_emoticon_image_path=(path)
  @pc_emoticon_image_path = path
end
pc_emoticon_yaml() click to toggle source
# File lib/jpmobile/emoticon.rb, line 280
def self.pc_emoticon_yaml
  @pc_emoticon_yaml
end
pc_emoticon_yaml=(file) click to toggle source
# File lib/jpmobile/emoticon.rb, line 276
def self.pc_emoticon_yaml=(file)
  @pc_emoticon_yaml = file
end
unicodecr_to_au_email(in_str) click to toggle source

str のなかでUnicode数値文字参照で表記された絵文字をメール送信用JISコードに変換する au 専用

# File lib/jpmobile/emoticon.rb, line 211
def self.unicodecr_to_au_email(in_str)
  str = Jpmobile::Util.ascii_8bit(in_str)
  regexp = Regexp.compile(Jpmobile::Util.ascii_8bit('&#x([0-9a-f]{4});'), Regexp::IGNORECASE)
  str = str.gsub(regexp) do |match|
    unicode = Regexp.last_match(1).scanf('%x').first
    converted = CONVERSION_TABLE_TO_AU[unicode]

    # メール用エンコーディングに変換する
    case converted
    when Integer
      sjis = UNICODE_TO_SJIS[converted]
      if sjis
        email_jis = SJIS_TO_EMAIL_JIS[sjis]
        if email_jis
          Jpmobile::Util.ascii_8bit("\x1b\x24\x42#{[email_jis].pack("n")}\x1b\x28\x42")
        else
          Jpmobile::Util.ascii_8bit([sjis].pack('n'))
        end
      else
        match
      end
    when String
      # FIXME: 絵文字の代替が文章でいいかどうかの検証
      Jpmobile::Util.ascii_8bit(Jpmobile::Util.utf8_to_jis(converted))
    else
      match
    end
  end
  regexp = Regexp.compile(Regexp.escape(Jpmobile::Util.ascii_8bit("\x1b\x28\x42\x1b\x24\x42")), Regexp::IGNORECASE)
  str.gsub(regexp, '')
end
unicodecr_to_external(str, conversion_table = nil, to_sjis = true) click to toggle source

str のなかでUnicode数値文字参照で表記された絵文字を携帯側エンコーディングに置換する。

キャリア間の変換に conversion_table を使う。conversion_tablenilを与えると、 キャリア間の変換は行わない。

携帯側エンコーディングがShift_JIS場合は to_sjistrue を指定する。 true を指定すると変換テーブルに文字列が指定されている場合にShift_JISで出力される。

# File lib/jpmobile/emoticon.rb, line 138
def self.unicodecr_to_external(str, conversion_table = nil, to_sjis = true)
  str.gsub(/&#x([0-9a-f]{4});/i) do |match|
    unicode = Regexp.last_match(1).scanf('%x').first

    converted = if conversion_table
                  conversion_table[unicode] # キャリア間変換
                else
                  unicode # 変換しない
                end

    # 携帯側エンコーディングに変換する
    case converted
    when Integer
      # 変換先がUnicodeで指定されている。つまり対応する絵文字がある。
      sjis = UNICODE_TO_SJIS[converted]
      if sjis
        if to_sjis
          Jpmobile::Util.sjis([sjis].pack('n'))
        else
          [converted].pack('U')
        end
      elsif SOFTBANK_UNICODE_TO_WEBCODE[converted - 0x1000]
        [converted - 0x1000].pack('U')
      elsif converted == GETA_CODE
        # PCで〓を表示する場合
        GETA
      elsif UNICODE_EMOTICONS.include?(converted) || GOOGLE_EMOTICONS.include?(converted)
        if unicode == GETA_CODE
          GETA
        else
          [converted].pack('U*')
        end
      else
        # キャリア変換テーブルに指定されていたUnicodeに対応する
        # 携帯側エンコーディングが見つからない(変換テーブルの不備の可能性あり)。
        match
      end
    when String
      # 変換先が数値参照だと、再変換する
      if converted.match?(/&#x([0-9a-f]{4});/i)
        self.unicodecr_to_external(converted, conversion_table, to_sjis)
      else
        # 変換先が文字列で指定されている。
        to_sjis ? Jpmobile::Util.utf8_to_sjis(converted) : converted
      end
    when nil
      # 変換先が定義されていない。
      match
    end
  end
end
unicodecr_to_softbank_email(str) click to toggle source

str のなかでUnicode数値文字参照で表記された絵文字をメール送信用JISコードに変換する softbank 専用

# File lib/jpmobile/emoticon.rb, line 245
def self.unicodecr_to_softbank_email(str)
  str.gsub(/&#x([0-9a-f]{4});/i) do |match|
    unicode = Regexp.last_match(1).scanf('%x').first
    converted = CONVERSION_TABLE_TO_SOFTBANK[unicode]

    # メール用エンコーディングに変換する
    case converted
    when Integer
      sjis = SOFTBANK_UNICODE_TO_SJIS[converted - 0x1000]
      if sjis
        Jpmobile::Util.sjis([sjis].pack('n'))
      else
        match
      end
    when String
      # FIXME: 絵文字の代替が文章でいいかどうかの検証
      Jpmobile::Util.utf8_to_sjis(converted)
    else
      match
    end
  end
end
unicodecr_to_utf8(str) click to toggle source

str のなかでUnicode数値文字参照で表記された絵文字をUTF-8に置換する。

# File lib/jpmobile/emoticon.rb, line 191
def self.unicodecr_to_utf8(str)
  str.gsub(/&#x([0-9a-f]{4});/i) do |match|
    unicode = Regexp.last_match(1).scanf('%x').first
    if UNICODE_TO_SJIS[unicode] || SOFTBANK_UNICODE_TO_WEBCODE[unicode - 0x1000]
      [unicode].pack('U')
    else
      match
    end
  end
end
utf8_to_unicodecr(str) click to toggle source

str のなかでUTF-8で表記された絵文字をUnicode数値文字参照に置換する。

# File lib/jpmobile/emoticon.rb, line 203
def self.utf8_to_unicodecr(str)
  str.gsub(UTF8_REGEXP) do |match|
    '&#x%04x;' % match.unpack1('U')
  end
end