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 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数値文字参照に置換した文字列を返す。
# 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数値文字参照に変換した文字列を返す。
# 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数値文字参照に変換した文字列を返す。
# 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
# 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_table にnilを与えると、 キャリア間の変換は行わない。
携帯側エンコーディングがShift_JIS場合は to_sjis に true を指定する。 true を指定すると変換テーブルに文字列が指定されている場合にShift_JISで出力される。
# 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に置換する。
# 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