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