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 14
14:     def self.external_to_unicodecr_au(str)
15:       str.gsub(AU_SJIS_REGEXP) do |match|
16:         sjis = match.unpack('n').first
17:         unicode = AU_SJIS_TO_UNICODE[sjis]
18:         unicode ? ("&#x%04x;"%unicode) : match
19:       end
20:     end

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 5
 5:     def self.external_to_unicodecr_docomo(str)
 6:       str.gsub(DOCOMO_SJIS_REGEXP) do |match|
 7:         sjis = match.unpack('n').first
 8:         unicode = DOCOMO_SJIS_TO_UNICODE[sjis]
 9:         unicode ? ("&#x%04x;"%unicode) : match
10:       end
11:     end

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 34
34:     def self.external_to_unicodecr_jphone(str)
35:       # SoftBank Webcode
36:       s = str.clone
37:       # 連続したエスケープコードが省略されている場合は切りはなす。
38:       s.gsub!(/\x1b\x24(.)(.+?)\x0f/) do |match|
39:         a = $1
40:         $2.split(//).map{|x| "\x1b\x24#{a}#{x}\x0f"}.join('')
41:       end
42:       # Webcodeを変換
43:       s.gsub(SOFTBANK_WEBCODE_REGEXP) do |match|
44:         unicode = SOFTBANK_WEBCODE_TO_UNICODE[match[2,2]] + 0x1000
45:         unicode ? ("&#x%04x;"%unicode) : match
46:       end
47:     end

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 23
23:     def self.external_to_unicodecr_softbank(str)
24:       # SoftBank Unicode
25:       str.gsub(SOFTBANK_UNICODE_REGEXP) do |match|
26:         unicode = match.unpack('U').first
27:         "&#x%04x;" % (unicode+0x1000)
28:       end
29:     end

[Source]

    # File lib/jpmobile/emoticon.rb, line 30
30:     def self.external_to_unicodecr_vodafone(str)
31:       external_to_unicodecr_softbank(str)
32:     end

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

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

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 56
56:     def self.unicodecr_to_external(str, conversion_table=nil, to_sjis=true)
57:       str.gsub(/&#x([0-9a-f]{4});/i) do |match|
58:         unicode = $1.scanf("%x").first
59:         if conversion_table
60:           converted = conversion_table[unicode] # キャリア間変換
61:         else
62:           converted = unicode # 変換しない
63:         end
64: 
65:         # 携帯側エンコーディングに変換する
66:         case converted
67:         when Integer
68:           # 変換先がUnicodeで指定されている。つまり対応する絵文字がある。
69:           if sjis = UNICODE_TO_SJIS[converted]
70:             [sjis].pack('n')
71:           elsif webcode = SOFTBANK_UNICODE_TO_WEBCODE[converted-0x1000]
72:             "\x1b\x24#{webcode}\x0f"
73:           else
74:             # キャリア変換テーブルに指定されていたUnicodeに対応する
75:             # 携帯側エンコーディングが見つからない(変換テーブルの不備の可能性あり)。
76:             match
77:           end
78:         when String
79:           # 変換先がUnicodeで指定されている。
80:           to_sjis ? Kconv::kconv(converted, Kconv::SJIS, Kconv::UTF8) : converted
81:         when nil
82:           # 変換先が定義されていない。
83:           match
84:         end
85:       end
86:     end

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

[Source]

    # File lib/jpmobile/emoticon.rb, line 88
88:     def self.unicodecr_to_utf8(str)
89:       str.gsub(/&#x([0-9a-f]{4});/i) do |match|
90:         unicode = $1.scanf("%x").first
91:         if UNICODE_TO_SJIS[unicode] || SOFTBANK_UNICODE_TO_WEBCODE[unicode-0x1000]
92:           [unicode].pack('U')
93:         else
94:           match
95:         end
96:       end
97:     end

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

[Source]

     # File lib/jpmobile/emoticon.rb, line 99
 99:     def self.utf8_to_unicodecr(str)
100:       str.gsub(UTF8_REGEXP) do |match|
101:         "&#x%04x;" % match.unpack('U').first
102:       end
103:     end

[Validate]