File tree Expand file tree Collapse file tree 2 files changed +26
-2
lines changed Expand file tree Collapse file tree 2 files changed +26
-2
lines changed Original file line number Diff line number Diff line change @@ -1289,8 +1289,20 @@ def generate_line(row, **options)
1289
1289
str = +""
1290
1290
if options [ :encoding ]
1291
1291
str . force_encoding ( options [ :encoding ] )
1292
- elsif field = row . find { |f | f . is_a? ( String ) }
1293
- str . force_encoding ( field . encoding )
1292
+ else
1293
+ fallback_encoding = nil
1294
+ output_encoding = nil
1295
+ row . each do |field |
1296
+ next unless field . is_a? ( String )
1297
+ fallback_encoding ||= field . encoding
1298
+ next if field . ascii_only?
1299
+ output_encoding = field . encoding
1300
+ break
1301
+ end
1302
+ output_encoding ||= fallback_encoding
1303
+ if output_encoding
1304
+ str . force_encoding ( output_encoding )
1305
+ end
1294
1306
end
1295
1307
( new ( str , **options ) << row ) . string
1296
1308
end
Original file line number Diff line number Diff line change @@ -242,6 +242,18 @@ def test_encoding_is_upgraded_for_ascii_content_during_writing_as_needed
242
242
assert_equal ( "UTF-8" , data . to_csv . encoding . name )
243
243
end
244
244
245
+ def test_encoding_is_not_upgraded_for_non_ascii_content_during_writing_as_needed
246
+ data = [ "\u00c0 " . encode ( "ISO-8859-1" ) , "\u3042 " ]
247
+ assert_equal ( [
248
+ "ISO-8859-1" ,
249
+ "UTF-8" ,
250
+ ] ,
251
+ data . collect { |field | field . encoding . name } )
252
+ assert_raise ( Encoding ::CompatibilityError ) do
253
+ data . to_csv
254
+ end
255
+ end
256
+
245
257
def test_explicit_encoding
246
258
bug9766 = '[ruby-core:62113] [Bug #9766]'
247
259
s = CSV . generate ( encoding : "Windows-31J" ) do |csv |
You can’t perform that action at this time.
0 commit comments