diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 69f2e2558..de017ef9b 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -117,36 +117,9 @@ module RepositoriesHelper end def to_utf8(str) - return str if str.nil? - str = to_utf8_internal(str) - if str.respond_to?(:force_encoding) - str.force_encoding('UTF-8') - end - str + Redmine::CodesetUtil.to_utf8_by_setting(str) end - def to_utf8_internal(str) - return str if str.nil? - if str.respond_to?(:force_encoding) - str.force_encoding('ASCII-8BIT') - end - return str if str.empty? - return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii - if str.respond_to?(:force_encoding) - str.force_encoding('UTF-8') - end - @encodings ||= Setting.repositories_encodings.split(',').collect(&:strip) - @encodings.each do |encoding| - begin - return Iconv.conv('UTF-8', encoding, str) - rescue Iconv::Failure - # do nothing here and try the next encoding - end - end - str = Redmine::CodesetUtil.replace_invalid_utf8(str) - end - private :to_utf8_internal - def repository_field_tags(form, repository) method = repository.class.name.demodulize.underscore + "_field_tags" if repository.is_a?(Repository) && diff --git a/lib/redmine/codeset_util.rb b/lib/redmine/codeset_util.rb index bf24080c6..b74a3a9e7 100644 --- a/lib/redmine/codeset_util.rb +++ b/lib/redmine/codeset_util.rb @@ -79,6 +79,40 @@ module Redmine str end + def self.to_utf8_by_setting(str) + return str if str.nil? + str = self.to_utf8_by_setting_internal(str) + if str.respond_to?(:force_encoding) + str.force_encoding('UTF-8') + end + str + end + + def self.to_utf8_by_setting_internal(str) + return str if str.nil? + if str.respond_to?(:force_encoding) + str.force_encoding('ASCII-8BIT') + end + return str if str.empty? + return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii + if str.respond_to?(:force_encoding) + str.force_encoding('UTF-8') + end + encodings = Setting.repositories_encodings.split(',').collect(&:strip) + encodings.each do |encoding| + begin + return Iconv.conv('UTF-8', encoding, str) + rescue Iconv::Failure + # do nothing here and try the next encoding + end + end + str = self.replace_invalid_utf8(str) + if str.respond_to?(:force_encoding) + str.force_encoding('UTF-8') + end + str + end + def self.from_utf8(str, encoding) str ||= '' if str.respond_to?(:force_encoding)