Module | Jpmobile::Emoticon |
In: |
lib/jpmobile/emoticon/z_combine.rb
lib/jpmobile/emoticon.rb |
絵文字関連処理
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 |
str のなかでDoCoMo絵文字をUnicode数値文字参照に置換した文字列を返す。
# 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数値文字参照に置換した文字列を返す。
# 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数値文字参照に変換した文字列を返す。
# 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数値文字参照に変換した文字列を返す。
# 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
# 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_table にnilを与えると、 キャリア間の変換は行わない。
携帯側エンコーディングがShift_JIS場合は to_sjis に true を指定する。 true を指定すると変換テーブルに文字列が指定されている場合にShift_JISで出力される。
# 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に置換する。
# 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