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 35
35:     def self.external_to_unicodecr_au(str)
36:       str.gsub(AU_SJIS_REGEXP) do |match|
37:         sjis = match.unpack('n').first
38:         unicode = AU_SJIS_TO_UNICODE[sjis]
39:         unicode ? ("&#x%04x;"%unicode) : match
40:       end
41:     end

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

[Source]

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

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

[Source]

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

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

[Source]

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 51
51:     def self.external_to_unicodecr_vodafone(str)
52:       external_to_unicodecr_softbank(str)
53:     end

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

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

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

[Source]

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

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

[Source]

     # File lib/jpmobile/emoticon.rb, line 114
114:     def self.unicodecr_to_utf8(str)
115:       str.gsub(/&#x([0-9a-f]{4});/i) do |match|
116:         unicode = $1.scanf("%x").first
117:         if UNICODE_TO_SJIS[unicode] || SOFTBANK_UNICODE_TO_WEBCODE[unicode-0x1000]
118:           [unicode].pack('U')
119:         else
120:           match
121:         end
122:       end
123:     end

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

[Source]

     # File lib/jpmobile/emoticon.rb, line 125
125:     def self.utf8_to_unicodecr(str)
126:       str.gsub(UTF8_REGEXP) do |match|
127:         "&#x%04x;" % match.unpack('U').first
128:       end
129:     end

[Validate]