Feature #34718 » 34718.patch
| app/models/import.rb | ||
|---|---|---|
| 65 | 65 | |
| 66 | 66 |   def set_default_settings(options={}) | 
| 67 | 67 | separator = lu(user, :general_csv_separator) | 
| 68 | encoding = lu(user, :general_csv_encoding) | |
| 68 | 69 | if file_exists? | 
| 69 | 70 | begin | 
| 70 | 71 | content = File.read(filepath, 256) | 
| 72 | ||
| 71 | 73 |         separator = [',', ';'].sort_by {|sep| content.count(sep)}.last | 
| 74 | ||
| 75 | guessed_encoding = Redmine::CodesetUtil.guess_encoding(file_content) | |
| 76 | encoding = | |
| 77 | (guessed_encoding && ( | |
| 78 |             Setting::ENCODINGS.detect {|e| e.casecmp?(guessed_encoding)} || | |
| 79 |             Setting::ENCODINGS.detect {|e| Encoding.find(e) == Encoding.find(guessed_encoding)} | |
| 80 | )) || lu(user, :general_csv_encoding) | |
| 72 | 81 | rescue => e | 
| 73 | 82 | end | 
| 74 | 83 | end | 
| 75 | 84 | wrapper = '"' | 
| 76 | encoding = lu(user, :general_csv_encoding) | |
| 77 | 85 | |
| 78 | 86 | date_format = lu(user, "date.formats.default", :default => "foo") | 
| 79 | 87 | date_format = DATE_FORMATS.first unless DATE_FORMATS.include?(date_format) | 
| lib/redmine/codeset_util.rb | ||
|---|---|---|
| 75 | 75 | str = self.replace_invalid_utf8(str) | 
| 76 | 76 | end | 
| 77 | 77 | end | 
| 78 | ||
| 79 | def self.guess_encoding(str) | |
| 80 | return if str.nil? | |
| 81 | ||
| 82 | str = str.dup | |
| 83 |       encodings = Setting.repositories_encodings.split(',').collect(&:strip) | |
| 84 | encodings = encodings.presence || ['UTF-8'] | |
| 85 | ||
| 86 | encodings.each do |encoding| | |
| 87 | begin | |
| 88 | str.force_encoding(encoding) | |
| 89 | rescue Encoding::ConverterNotFoundError | |
| 90 | # ignore if the encoding name is invalid | |
| 91 | end | |
| 92 | return encoding if str.valid_encoding? | |
| 93 | end | |
| 94 | nil | |
| 95 | end | |
| 78 | 96 | end | 
| 79 | 97 | end | 
| test/unit/issue_import_test.rb | ||
|---|---|---|
| 411 | 411 | |
| 412 | 412 | assert_empty import.mapping | 
| 413 | 413 | end | 
| 414 | ||
| 415 | def test_set_default_settings_should_guess_encoding | |
| 416 |     import = generate_import('import_iso8859-1.csv') | |
| 417 | with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do | |
| 418 | import.set_default_settings | |
| 419 | guessed_encoding = import.settings['encoding'] | |
| 420 | assert_equal 'ISO-8859-1', guessed_encoding | |
| 421 | end | |
| 422 | with_settings :repositories_encodings => 'UTF-8,iso8859-1' do | |
| 423 | import.set_default_settings | |
| 424 | guessed_encoding = import.settings['encoding'] | |
| 425 | assert_equal 'ISO-8859-1', guessed_encoding | |
| 426 | assert_includes Setting::ENCODINGS, guessed_encoding | |
| 427 | end | |
| 428 | end | |
| 429 | ||
| 430 | def test_set_default_settings_should_use_general_csv_encoding_when_cannnot_guess_encoding | |
| 431 |     import = generate_import('import_iso8859-1.csv') | |
| 432 | user = User.generate!(:language => 'ja') | |
| 433 | import.user = user | |
| 434 | with_settings :repositories_encodings => 'UTF-8' do | |
| 435 | import.set_default_settings | |
| 436 | guessed_encoding = import.settings['encoding'] | |
| 437 | assert_equal 'CP932', lu(user, :general_csv_encoding) | |
| 438 | assert_equal 'CP932', guessed_encoding | |
| 439 | end | |
| 440 | end | |
| 414 | 441 | end | 
| test/unit/lib/redmine/codeset_util_test.rb | ||
|---|---|---|
| 101 | 101 | assert_equal "UTF-8", s2.encoding.to_s | 
| 102 | 102 | assert_equal 'こんにち?', s2 | 
| 103 | 103 | end | 
| 104 | ||
| 105 | test_guess_encoding_should_return_guessed_encoding do | |
| 106 |     str = '日本語'.encode('Windows-31J').b | |
| 107 | with_settings :repositories_encodings => 'UTF-8,Windows-31J' do | |
| 108 | assert_equal 'Windows-31J', Redmine::CodesetUtil.guess_encoding(str) | |
| 109 | end | |
| 110 | with_settings :repositories_encodings => 'UTF-8,csWindows31J' do | |
| 111 | assert_equal 'csWindows31J', Redmine::CodesetUtil.guess_encoding(str) | |
| 112 | end | |
| 113 | end | |
| 114 | ||
| 115 | test guess_encoding_should_return_nil_if_cannot_guess_encoding do | |
| 116 |     str = '日本語'.encode('Windows-31J').b | |
| 117 | with_settings :repositories_encodings => 'UTF-8,EUC-JP' do | |
| 118 | assert_nil Redmine::CodesetUtil.guess_encoding(str) | |
| 119 | end | |
| 120 | end | |
| 104 | 121 | end |