@@ -88,7 +88,9 @@ def Ruby19.get_constant(klass, string)
88
88
end
89
89
90
90
def Ruby19 . transcode_charset ( str , from_encoding , to_encoding = Encoding ::UTF_8 )
91
- charset_encoder . encode ( str . dup , from_encoding ) . encode ( to_encoding , :undef => :replace , :invalid => :replace , :replace => '' )
91
+ to_encoding = Encoding . find ( to_encoding )
92
+ replacement_char = to_encoding == Encoding ::UTF_8 ? '�' : '?'
93
+ charset_encoder . encode ( str . dup , from_encoding ) . encode ( to_encoding , :undef => :replace , :invalid => :replace , :replace => replacement_char )
92
94
end
93
95
94
96
# From Ruby stdlib Net::IMAP
@@ -125,8 +127,7 @@ def Ruby19.b_value_decode(str)
125
127
str = Ruby19 . decode_base64 ( match [ 2 ] )
126
128
str = charset_encoder . encode ( str , charset )
127
129
end
128
- decoded = str . encode ( Encoding ::UTF_8 , :undef => :replace , :invalid => :replace , :replace => "" )
129
- decoded . valid_encoding? ? decoded : decoded . encode ( Encoding ::UTF_16LE , :invalid => :replace , :replace => "" ) . encode ( Encoding ::UTF_8 )
130
+ transcode_to_scrubbed_utf8 ( str )
130
131
rescue Encoding ::UndefinedConversionError , ArgumentError , Encoding ::ConverterNotFoundError
131
132
warn "Encoding conversion failed #{ $!} "
132
133
str . dup . force_encoding ( Encoding ::UTF_8 )
@@ -150,8 +151,7 @@ def Ruby19.q_value_decode(str)
150
151
# jruby/jruby#829 which subtly changes String#encode semantics.
151
152
str . force_encoding ( Encoding ::UTF_8 ) if str . encoding == Encoding ::ASCII_8BIT
152
153
end
153
- decoded = str . encode ( Encoding ::UTF_8 , :invalid => :replace , :replace => "" )
154
- decoded . valid_encoding? ? decoded : decoded . encode ( Encoding ::UTF_16LE , :invalid => :replace , :replace => "" ) . encode ( Encoding ::UTF_8 )
154
+ transcode_to_scrubbed_utf8 ( str )
155
155
rescue Encoding ::UndefinedConversionError , ArgumentError , Encoding ::ConverterNotFoundError
156
156
warn "Encoding conversion failed #{ $!} "
157
157
str . dup . force_encoding ( Encoding ::UTF_8 )
@@ -253,6 +253,11 @@ def convert_to_encoding(encoding)
253
253
end
254
254
end
255
255
end
256
+
257
+ def transcode_to_scrubbed_utf8 ( str )
258
+ decoded = str . encode ( Encoding ::UTF_8 , :undef => :replace , :invalid => :replace , :replace => "�" )
259
+ decoded . valid_encoding? ? decoded : decoded . encode ( Encoding ::UTF_16LE , :invalid => :replace , :replace => "�" ) . encode ( Encoding ::UTF_8 )
260
+ end
256
261
end
257
262
end
258
263
end
0 commit comments