Вот 2 распространенных ситуации и как с ними справиться:
Ситуация 1
У вас есть входной файл UTF-8 с возможно несколькими недопустимыми байтами
Удалить недействительные байты:
test = "Partly valid\xE4 UTF-8 encoding: äöüß"
File.open( 'input_file', 'w' ) {|f| f.write(test)}
str = File.read( 'input_file' )
str.scrub('')
=> "Partly valid UTF-8 encoding: äöüß"
Ситуация 2
У вас есть входной файл, который может быть в кодировке UTF-8 или ISO-8859-1
Проверьте, какая это кодировка и конвертируйте в UTF-8 (при необходимости):
test = "String in ISO-8859-1 encoding: \xE4\xF6\xFC\xDF"
File.open( 'input_file', 'w' ) {|f| f.write(test)}
str = File.read( 'input_file' )
unless str.valid_encoding?
str.encode!( 'UTF-8', 'ISO-8859-1', invalid: :replace )
end #unless
=> "String in ISO-8859-1 encoding: äöüß"
Примечания
Приведенные выше фрагменты кода предполагают, что Ruby кодирует все ваши строки в UTF-8
по умолчанию. Несмотря на то, что это почти всегда так, вы можете убедиться в этом, запустив свои сценарии с # encoding: UTF-8
.
Если указано неверно, программно возможно обнаружить большинство многобайтовых кодировок, таких как UTF-8
(в Ruby см .: #valid_encoding?
). Однако НЕЛЬЗЯ (или, по крайней мере, крайне сложно) программно обнаружить недействительность однобайтовых кодировок, таких как ISO-8859-1
. Таким образом, приведенный выше фрагмент кода не работает наоборот, то есть обнаруживает, является ли строка действительной кодировкой ISO-8859-1
.
Хотя UTF-8
становится все более популярным в качестве кодировки по умолчанию в компьютерных системах, ISO-8859-1
и другие Latin1
разновидности все еще очень популярны в западных странах, особенно в Северной Америке. Имейте в виду, что существует несколько однобайтовых кодировок, которые очень похожи, но немного отличаются от ISO-8859-1. Примеры: CP1252
(a.k.a. Windows-1252
), ISO-8859-15
[ruby] [кодировка] [utf8] [кодировка файла] [кодировка символов]