Module Jpmobile::Emoticon
In: lib/jpmobile/emoticon/z_combine.rb
lib/jpmobile/emoticon.rb

絵文字関連処理

Methods

Constants

SJIS_TO_UNICODE = {}
UNICODE_TO_SJIS = SJIS_TO_UNICODE.invert.freeze
SJIS_REGEXP = Regexp.union(*SJIS_TO_UNICODE.keys.map{|s| Regexp.compile(Regexp.escape([s].pack('n'),"s"),nil,'s')})
SOFTBANK_WEBCODE_REGEXP = Regexp.union(*([/(?!)/n]+SOFTBANK_WEBCODE_TO_UNICODE.keys.map{|x| "\x1b\x24#{x}\x0f"}))
DOCOMO_SJIS_REGEXP = Regexp.union(*DOCOMO_SJIS_TO_UNICODE.keys.map{|s| Regexp.compile(Regexp.escape([s].pack('n'),"s"),nil,'s')})
AU_SJIS_REGEXP = Regexp.union(*AU_SJIS_TO_UNICODE.keys.map{|s| Regexp.compile(Regexp.escape([s].pack('n'),"s"),nil,'s')})
SOFTBANK_UNICODE_REGEXP = Regexp.union(*SOFTBANK_UNICODE_TO_WEBCODE.keys.map{|x| [x].pack('U')}).freeze
EMOTICON_UNICODES = UNICODE_TO_SJIS.keys|SOFTBANK_UNICODE_TO_WEBCODE.keys.map{|k|k+0x1000}
UTF8_REGEXP = Regexp.union(*EMOTICON_UNICODES.map{|x| [x].pack('U')}).freeze

Public Class methods

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 32
32:     def self.external_to_unicodecr_au(str)
33:       str.gsub(AU_SJIS_REGEXP) do |match|
34:         sjis = match.unpack('n').first
35:         unicode = AU_SJIS_TO_UNICODE[sjis]
36:         unicode ? ("&#x%04x;"%unicode) : match
37:       end
38:     end

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 23
23:     def self.external_to_unicodecr_docomo(str)
24:       str.gsub(DOCOMO_SJIS_REGEXP) do |match|
25:         sjis = match.unpack('n').first
26:         unicode = DOCOMO_SJIS_TO_UNICODE[sjis]
27:         unicode ? ("&#x%04x;"%unicode) : match
28:       end
29:     end

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 52
52:     def self.external_to_unicodecr_jphone(str)
53:       # SoftBank Webcode
54:       s = str.clone
55:       # 連続したエスケープコードが省略されている場合は切りはなす。
56:       s.gsub!(/\x1b\x24(.)(.+?)\x0f/) do |match|
57:         a = $1
58:         $2.split(//).map{|x| "\x1b\x24#{a}#{x}\x0f"}.join('')
59:       end
60:       # Webcodeを変換
61:       s.gsub(SOFTBANK_WEBCODE_REGEXP) do |match|
62:         unicode = SOFTBANK_WEBCODE_TO_UNICODE[match[2,2]] + 0x1000
63:         unicode ? ("&#x%04x;"%unicode) : match
64:       end
65:     end

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 41
41:     def self.external_to_unicodecr_softbank(str)
42:       # SoftBank Unicode
43:       str.gsub(SOFTBANK_UNICODE_REGEXP) do |match|
44:         unicode = match.unpack('U').first
45:         "&#x%04x;" % (unicode+0x1000)
46:       end
47:     end

[Source]

    # File lib/jpmobile/emoticon.rb, line 48
48:     def self.external_to_unicodecr_vodafone(str)
49:       external_to_unicodecr_softbank(str)
50:     end

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

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

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

[Source]

     # File lib/jpmobile/emoticon.rb, line 74
 74:     def self.unicodecr_to_external(str, conversion_table=nil, to_sjis=true)
 75:       str.gsub(/&#x([0-9a-f]{4});/i) do |match|
 76:         unicode = $1.scanf("%x").first
 77:         if conversion_table
 78:           converted = conversion_table[unicode] # キャリア間変換
 79:         else
 80:           converted = unicode # 変換しない
 81:         end
 82: 
 83:         # 携帯側エンコーディングに変換する
 84:         case converted
 85:         when Integer
 86:           # 変換先がUnicodeで指定されている。つまり対応する絵文字がある。
 87:           if sjis = UNICODE_TO_SJIS[converted]
 88:             [sjis].pack('n')
 89:           elsif webcode = SOFTBANK_UNICODE_TO_WEBCODE[converted-0x1000]
 90:             "\x1b\x24#{webcode}\x0f"
 91:           else
 92:             # キャリア変換テーブルに指定されていたUnicodeに対応する
 93:             # 携帯側エンコーディングが見つからない(変換テーブルの不備の可能性あり)。
 94:             match
 95:           end
 96:         when String
 97:           # 変換先がUnicodeで指定されている。
 98:           to_sjis ? Kconv::kconv(converted, Kconv::SJIS, Kconv::UTF8) : converted
 99:         when nil
100:           # 変換先が定義されていない。
101:           match
102:         end
103:       end
104:     end

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

[Source]

     # File lib/jpmobile/emoticon.rb, line 106
106:     def self.unicodecr_to_utf8(str)
107:       str.gsub(/&#x([0-9a-f]{4});/i) do |match|
108:         unicode = $1.scanf("%x").first
109:         if UNICODE_TO_SJIS[unicode] || SOFTBANK_UNICODE_TO_WEBCODE[unicode-0x1000]
110:           [unicode].pack('U')
111:         else
112:           match
113:         end
114:       end
115:     end

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

[Source]

     # File lib/jpmobile/emoticon.rb, line 117
117:     def self.utf8_to_unicodecr(str)
118:       str.gsub(UTF8_REGEXP) do |match|
119:         "&#x%04x;" % match.unpack('U').first
120:       end
121:     end

[Validate]