Ruby имеет развитую поддержку Unicode и работы с различными кодировками символов. Рассмотрим ключевые аспекты этой функциональности.
# Узнаем кодировку текущего файла
puts __ENCODING__ # => UTF-8
# Установка кодировки для исходного файла (должна быть первой строкой)
# coding: utf-8
Encoding.default_external = 'UTF-8'
Encoding.default_internal = 'UTF-8'
# Символы Unicode по коду
puts "\u{1F600}" # => 😀 (смайлик)
puts "\u00A9" # => © (знак копирайта)
# Строки с Unicode
str = "日本語" # Японские иероглифы
puts str.length # => 3 (символа)
"Привет".each_codepoint do |codepoint|
puts "#{codepoint.to_s(16)}" # Выводит коды Unicode в hex
end
"🌍".codepoints # => [127757]
utf8_str = "тест"
win1251_str = utf8_str.encode('Windows-1251')
# Проверка кодировки
puts win1251_str.encoding.name # => Windows-1251
begin
str = "日本語".encode('ASCII')
rescue Encoding::UndefinedConversionError => e
puts "Ошибка конвертации: #{e.message}"
end
# Альтернативный вариант с обработкой ошибок
str = "日本語".encode('ASCII', undef: :replace, replace: '?')
puts str # => "???"
# Использование гема charlock_holmes
require 'charlock_holmes'
content = File.read('unknown.txt', mode: 'rb')
detection = CharlockHolmes::EncodingDetector.detect(content)
puts detection[:encoding] # => 'UTF-8'
# Чтение файла в кодировке Windows-1251
content = File.read('file.txt', encoding: 'Windows-1251:UTF-8')
# Или с автоматическим определением BOM
content = File.read('file.txt', mode: 'rb')
if content.start_with?("\xEF\xBB\xBF".force_encoding('BINARY'))
content.force_encoding('UTF-8')
end
# Соответствие Unicode-символам
puts "日本語" =``` /\p{Han}/ # => 0 (содержит китайские иероглифы)
# Unicode свойства
puts "A".match?(/\p{Upper}/) # => true
puts "á".match?(/\p{Latin}/) # => true
require 'unicode_normalizer'
str = "Café"
nfd = str.unicode_normalize(:nfd)
nfc = str.unicode_normalize(:nfc)
puts nfd == nfc # => false (разные формы нормализации)
def real_length(str)
str.each_char.count
end
puts real_length("🌍🤖") # => 2
require 'translit'
puts Translit.convert("Привет") # => "Privet"
def valid_utf8?(str)
str.force_encoding('UTF-8').valid_encoding?
end
puts valid_utf8?("test\xFF") # => false
Всегда явно указывайте кодировку исходных файлов:
# coding: utf-8
Устанавливайте кодировки по умолчанию в начале приложения:
Encoding.default_external = 'UTF-8'
Для работы с бинарными данными используйте:
File.open(file, 'rb')
Проверяйте валидность кодировки перед обработкой:
str.valid_encoding?
Для сложных операций используйте гемы:
charlock_holmes
- определение кодировкиunicode_utils
- дополнительные функцииunf
- нормализацияRuby предоставляет комплексную поддержку Unicode и работы с кодировками:
Для надежной работы с текстом: