This repository has been archived by the owner on Apr 13, 2019. It is now read-only.
/
encoding.rb
54 lines (51 loc) · 2.03 KB
/
encoding.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
module Cinch
module Utilities
module Encoding
# @api private
def self.encode_incoming(string, encoding)
string = string.dup
if encoding == :irc
# If incoming text is valid UTF-8, it will be interpreted as
# such. If it fails validation, a CP1252 -> UTF-8 conversion
# is performed. This allows you to see non-ASCII from mIRC
# users (non-UTF-8) and other users sending you UTF-8.
#
# (from http://xchat.org/encoding/#hybrid)
string.force_encoding("UTF-8")
if !string.valid_encoding?
string.force_encoding("CP1252").encode!("UTF-8", {:invalid => :replace, :undef => :replace})
end
else
string.force_encoding(encoding).encode!({:invalid => :replace, :undef => :replace})
string = string.chars.select { |c| c.valid_encoding? }.join
end
return string
end
# @api private
def self.encode_outgoing(string, encoding)
string = string.dup
if encoding == :irc
# If your text contains only characters that fit inside the CP1252
# code page (aka Windows Latin-1), the entire line will be sent
# that way. mIRC users should see it correctly. XChat users who
# are using UTF-8 will also see it correctly, because it will fail
# UTF-8 validation and will be assumed to be CP1252, even by older
# XChat versions.
#
# If the text doesn't fit inside the CP1252 code page, (for eaxmple if you
# type Eastern European characters, or Russian) it will be sent as UTF-8. Only
# UTF-8 capable clients will be able to see these characters correctly
#
# (from http://xchat.org/encoding/#hybrid)
begin
string.encode!("CP1252")
rescue Encoding::UndefinedConversionError
end
else
string.encode!(encoding, {:invalid => :replace, :undef => :replace})
end
return string
end
end
end
end