Module: Jpmobile::Util

Defined in:
lib/jpmobile/util.rb

Constant Summary collapse

SJIS =

SJIS = “Shift_JIS”

'Windows-31J'.freeze
UTF8 =
'UTF-8'.freeze
JIS =
'ISO-2022-JP'.freeze
JIS_WIN =
'CP50220'.freeze
BINARY =
'ASCII-8BIT'.freeze
WAVE_DASH =
[0x301c].pack('U')
FULLWIDTH_TILDE =
[0xff5e].pack('U')
OVERLINE =
[0x203e].pack('U')
FULLWIDTH_MACRON =
[0xffe3].pack('U')
EM_DASH =
[0x2014].pack('U')
HORIZONTAL_BAR =
[0x2015].pack('U')
MINUS_SIGN =
[0x2212].pack('U')
FULLWIDTH_HYPHEN_MINUS =
[0xFF0D].pack('U')

Class Method Summary collapse

Class Method Details

.ascii_8bit(str) ⇒ Object



79
80
81
82
83
84
# File 'lib/jpmobile/util.rb', line 79

def ascii_8bit(str)
  unless ascii_8bit?(str)
    str = str.dup.force_encoding(BINARY)
  end
  str
end

.ascii_8bit?(str) ⇒ Boolean

Returns:

  • (Boolean)


264
265
266
# File 'lib/jpmobile/util.rb', line 264

def ascii_8bit?(str)
  detect_encoding(str) == BINARY
end

.ascii_compatible!(str) ⇒ Object



86
87
88
89
90
91
# File 'lib/jpmobile/util.rb', line 86

def ascii_compatible!(str)
  unless str.encoding.ascii_compatible?
    str = str.dup.force_encoding(BINARY)
  end
  str
end

.decode(str, encoding, charset) ⇒ Object



311
312
313
314
315
316
317
318
319
320
321
322
323
324
# File 'lib/jpmobile/util.rb', line 311

def decode(str, encoding, charset)
  _str = case encoding
         when /quoted-printable/i
           str.unpack1('M').strip
         when /base64/i
           str.unpack1('m').strip
         else
           str
         end

  _extract_charset = Jpmobile::Util.extract_charset(_str)
  charset = _extract_charset unless _extract_charset.empty? || (_extract_charset == charset)
  Jpmobile::Util.set_encoding(_str, charset)
end

.deep_convert(obj, &proc) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/jpmobile/util.rb', line 26

def deep_convert(obj, &proc)
  case obj
  when Hash
    new_obj = {}
    obj.each_pair do |key, value|
      new_obj[deep_convert(key.dup, &proc)] = deep_convert(value, &proc)
    end
    new_obj
  when Array
    new_obj = obj.map do |value|
      deep_convert(value, &proc)
    end
  when Symbol
    new_obj = yield(obj.to_s).to_sym
  when String
    obj = obj.to_param if obj.respond_to?(:to_param)
    new_obj = yield(obj)
  else
    # NilClass, TrueClass, FalseClass, Tempfile, StringIO, etc...
    new_obj = obj
  end

  new_obj
end

.detect_encoding(str) ⇒ Object



250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/jpmobile/util.rb', line 250

def detect_encoding(str)
  case str.encoding
  when ::Encoding::ISO2022_JP
    JIS
  when ::Encoding::Shift_JIS, ::Encoding::Windows_31J, ::Encoding::CP932
    SJIS
  when ::Encoding::UTF_8
    UTF8
  else
    # 上記以外はすべて BINARY 扱い
    BINARY
  end
end

.emdash_to_horizontal_bar(utf8_str) ⇒ Object



193
194
195
# File 'lib/jpmobile/util.rb', line 193

def emdash_to_horizontal_bar(utf8_str)
  utf8_str.gsub(EM_DASH, HORIZONTAL_BAR)
end

.encode(str, charset) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/jpmobile/util.rb', line 163

def encode(str, charset)
  return str if charset.nil? || (charset == '') || str.nil? || (str == '')
  return str.encode(charset) unless utf8?(str)

  case charset
  when /iso-2022-jp/i
    utf8_to_jis(str)
  when /shift_jis/i
    utf8_to_sjis(str)
  when /utf-8/i
    str
  end
end

.extract_charset(str) ⇒ Object



237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/jpmobile/util.rb', line 237

def extract_charset(str)
  case str
  when /iso-2022-jp/i
    'ISO-2022-JP'
  when /shift_jis/i
    'Shift_JIS'
  when /utf-8/i
    'UTF-8'
  else
    ''
  end
end

.fold_text(str, size = 15) ⇒ Object



280
281
282
283
284
285
286
287
288
289
# File 'lib/jpmobile/util.rb', line 280

def fold_text(str, size = 15)
  folded_texts = []

  while (texts = split_text(str, size)) && (texts.first.size != 0)
    folded_texts << texts.first
    str = texts.last
  end

  folded_texts
end

.force_encode(str, from, to) ⇒ Object



205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/jpmobile/util.rb', line 205

def force_encode(str, from, to)
  s = str.dup
  return str if detect_encoding(str) == to

  to = SJIS if to.match?(/shift_jis/i)

  to_enc = ::Encoding.find(to)
  return str if s.encoding == to_enc

  if from
    from_enc = ::Encoding.find(from)
    s.force_encoding(from) unless s.encoding == from_enc
  end

  begin
    s.encode(to)
  rescue ::Encoding::InvalidByteSequenceError, ::Encoding::UndefinedConversionError => e
    # iPhone MailがISO-2022-JPに半角カナや①などのCP50220文字を含めてくる問題対策
    raise e unless s.encoding == ::Encoding::ISO2022_JP

    s.force_encoding(::Encoding::CP50220)
    retry
  end
end

.fullwidth_hyphen_minus_to_minus_sign(utf8_str) ⇒ Object



201
202
203
# File 'lib/jpmobile/util.rb', line 201

def fullwidth_hyphen_minus_to_minus_sign(utf8_str)
  utf8_str.gsub(FULLWIDTH_HYPHEN_MINUS, MINUS_SIGN)
end

.fullwidth_macron_to_overline(utf8_str) ⇒ Object



189
190
191
# File 'lib/jpmobile/util.rb', line 189

def fullwidth_macron_to_overline(utf8_str)
  utf8_str.gsub(FULLWIDTH_MACRON, OVERLINE)
end

.fullwidth_tilde_to_wavedash(utf8_str) ⇒ Object



181
182
183
# File 'lib/jpmobile/util.rb', line 181

def fullwidth_tilde_to_wavedash(utf8_str)
  utf8_str.gsub(FULLWIDTH_TILDE, WAVE_DASH)
end

.hash_to_utf8(hash) ⇒ Object



136
137
138
139
140
141
# File 'lib/jpmobile/util.rb', line 136

def hash_to_utf8(hash)
  new_hash = {}
  hash.each do |key, value|
    new_hash[utf8(key)] = utf8(value)
  end
end

.invert_table(hash) ⇒ Object



297
298
299
300
301
302
303
304
305
306
307
308
309
# File 'lib/jpmobile/util.rb', line 297

def invert_table(hash)
  result = {}
  hash.each_key do |key|
    if result[hash[key]]
      if !key.is_a?(Array) && !result[hash[key]].is_a?(Array) && result[hash[key]] > key
        result[hash[key]] = key
      end
    else
      result[hash[key]] = key
    end
  end
  result
end

.jis(str) ⇒ Object



65
66
67
68
69
70
# File 'lib/jpmobile/util.rb', line 65

def jis(str)
  unless jis?(str)
    str = str.dup.force_encoding(JIS)
  end
  str
end

.jis?(str) ⇒ Boolean

Returns:

  • (Boolean)


276
277
278
# File 'lib/jpmobile/util.rb', line 276

def jis?(str)
  detect_encoding(str) == JIS
end

.jis_regexp(jis) ⇒ Object



153
154
155
156
157
# File 'lib/jpmobile/util.rb', line 153

def jis_regexp(jis)
  jis_str = jis.is_a?(Numeric) ? [jis].pack('n') : jis

  Regexp.compile(Regexp.escape(jis_str.force_encoding(BINARY)))
end

.jis_string_regexpObject



159
160
161
# File 'lib/jpmobile/util.rb', line 159

def jis_string_regexp
  Regexp.compile(Regexp.escape(ascii_8bit("\x1b\x24\x42")) + '(.+?)' + Regexp.escape(ascii_8bit("\x1b\x28\x42")))
end

.jis_to_utf8(jis_str) ⇒ Object



124
125
126
# File 'lib/jpmobile/util.rb', line 124

def jis_to_utf8(jis_str)
  jis_str.encode(UTF8, universal_newline: true)
end

.jis_win(str) ⇒ Object



72
73
74
75
76
77
# File 'lib/jpmobile/util.rb', line 72

def jis_win(str)
  unless jis?(str)
    str = str.dup.force_encoding(JIS_WIN)
  end
  str
end

.minus_sign_to_fullwidth_hyphen_minus(utf8_str) ⇒ Object



197
198
199
# File 'lib/jpmobile/util.rb', line 197

def minus_sign_to_fullwidth_hyphen_minus(utf8_str)
  utf8_str.gsub(MINUS_SIGN, FULLWIDTH_HYPHEN_MINUS)
end

.overline_to_fullwidth_macron(utf8_str) ⇒ Object



185
186
187
# File 'lib/jpmobile/util.rb', line 185

def overline_to_fullwidth_macron(utf8_str)
  utf8_str.gsub(OVERLINE, FULLWIDTH_MACRON)
end

.regexp_to_sjis(sjis_str) ⇒ Object



132
133
134
# File 'lib/jpmobile/util.rb', line 132

def regexp_to_sjis(sjis_str)
  Regexp.compile(Regexp.escape(sjis(sjis_str)))
end

.regexp_utf8_to_sjis(utf8_str) ⇒ Object



128
129
130
# File 'lib/jpmobile/util.rb', line 128

def regexp_utf8_to_sjis(utf8_str)
  Regexp.compile(Regexp.escape(utf8_to_sjis(utf8_str)))
end

.set_encoding(str, encoding) ⇒ Object



230
231
232
233
234
235
# File 'lib/jpmobile/util.rb', line 230

def set_encoding(str, encoding)
  encoding = SJIS if encoding.match?(/shift_jis/i)
  str.force_encoding(encoding)

  str
end

.shift_jis?(str) ⇒ Boolean

Returns:

  • (Boolean)


272
273
274
# File 'lib/jpmobile/util.rb', line 272

def shift_jis?(str)
  detect_encoding(str) == SJIS
end

.sjis(str) ⇒ Object



51
52
53
54
55
56
# File 'lib/jpmobile/util.rb', line 51

def sjis(str)
  unless shift_jis?(str)
    str = str.dup.force_encoding(SJIS)
  end
  str
end

.sjis_regexp(sjis) ⇒ Object



143
144
145
146
147
148
149
150
151
# File 'lib/jpmobile/util.rb', line 143

def sjis_regexp(sjis)
  sjis_str = if sjis.is_a?(Numeric)
               [sjis].pack('n')
             else
               sjis
             end

  Regexp.compile(Regexp.escape(sjis_str.force_encoding(SJIS)))
end

.sjis_to_utf8(sjis_str) ⇒ Object



108
109
110
111
112
113
# File 'lib/jpmobile/util.rb', line 108

def sjis_to_utf8(sjis_str)
  utf8_str = sjis_str.encode('UTF-8', universal_newline: true)

  # 波ダッシュ対策
  fullwidth_tilde_to_wavedash(utf8_str)
end

.split_text(str, size = 15) ⇒ Object



291
292
293
294
295
# File 'lib/jpmobile/util.rb', line 291

def split_text(str, size = 15)
  return nil if str.nil? || (str == '')

  [str[0..(size - 1)], str[size..]]
end

.utf8(str) ⇒ Object



58
59
60
61
62
63
# File 'lib/jpmobile/util.rb', line 58

def utf8(str)
  unless utf8?(str)
    str = str.dup.force_encoding(UTF8)
  end
  str
end

.utf8?(str) ⇒ Boolean

Returns:

  • (Boolean)


268
269
270
# File 'lib/jpmobile/util.rb', line 268

def utf8?(str)
  detect_encoding(str) == UTF8
end

.utf8_to_jis(utf8_str) ⇒ Object



115
116
117
118
119
120
121
122
# File 'lib/jpmobile/util.rb', line 115

def utf8_to_jis(utf8_str)
  # 波ダッシュ対策
  utf8_str = fullwidth_tilde_to_wavedash(utf8_str)

  utf8_str.
    gsub(/(\r\n|\r|\n)/, "\r\n").
    encode(JIS, undef: :replace, replace: '?')
end

.utf8_to_sjis(utf8_str) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/jpmobile/util.rb', line 93

def utf8_to_sjis(utf8_str)
  # 波ダッシュ対策
  utf8_str = wavedash_to_fullwidth_tilde(utf8_str)
  # オーバーライン対策(不可逆的)
  utf8_str = overline_to_fullwidth_macron(utf8_str)
  # ダッシュ対策(不可逆的)
  utf8_str = emdash_to_horizontal_bar(utf8_str)
  # マイナス対策(不可逆的)
  utf8_str = minus_sign_to_fullwidth_hyphen_minus(utf8_str)

  utf8_str.
    gsub(/(\r\n|\r|\n)/, "\r\n").
    encode(SJIS, undef: :replace, replace: '?')
end

.wavedash_to_fullwidth_tilde(utf8_str) ⇒ Object



177
178
179
# File 'lib/jpmobile/util.rb', line 177

def wavedash_to_fullwidth_tilde(utf8_str)
  utf8_str.gsub(WAVE_DASH, FULLWIDTH_TILDE)
end