Files
discourse/lib/encodings.rb
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

33 lines
904 B
Ruby
Raw Normal View History

# frozen_string_literal: true
2018-07-31 12:02:18 +02:00
require "rchardet"
2018-07-27 19:41:53 +02:00
module Encodings
2018-07-31 12:02:18 +02:00
def self.to_utf8(string)
result = CharDet.detect(string)
2018-07-27 19:41:53 +02:00
2018-07-31 12:02:18 +02:00
encoded_string = try_utf8(string, result["encoding"]) if result && result["encoding"]
encoded_string = force_utf8(string) if encoded_string.nil?
encoded_string
2018-07-27 19:41:53 +02:00
end
def self.try_utf8(string, source_encoding)
encoded = string.encode(Encoding::UTF_8, source_encoding)
encoded&.valid_encoding? ? delete_bom!(encoded) : nil
rescue Encoding::InvalidByteSequenceError,
Encoding::UndefinedConversionError,
Encoding::ConverterNotFoundError
nil
end
2018-07-31 12:02:18 +02:00
def self.force_utf8(string)
encoded_string = string.encode(Encoding::UTF_8, undef: :replace, invalid: :replace, replace: "")
delete_bom!(encoded_string)
end
2018-07-27 19:41:53 +02:00
def self.delete_bom!(string)
string.sub!(/\A\xEF\xBB\xBF/, "") unless string.blank?
string
end
end