класс ActiveSupport::Multibyte::Chars
Chars позволяет вам работать с кодировкой UTF-8 в классе Ruby String прозрачно, без глубокого знания кодировок. Объект Chars принимает строку при инициализации и делегирует методы класса String безопасным для кодировки способом. Все обычные методы класса String также реализованы для прокси.
Методы класса String делегируются через объект Chars и могут быть вызваны через метод mb_chars. Методы, которые обычно возвращают объект String, теперь возвращают объект Chars, что позволяет цепочку вызовов методов.
'The Perfect String '.mb_chars.downcase.strip.normalize # => #<ActiveSupport::Multibyte::Chars:0x007fdc434ccc10 @wrapped_string="the perfect string">
Объекты Chars идеально взаимозаменяемы с объектами String, пока не выполняются явные проверки класса. Если определённые методы явно проверяют класс, вызовите to_s перед тем, как передавать объекты chars.
bad.explicit_checking_method 'T'.mb_chars.downcase.to_s
По умолчанию реализация Chars предполагает, что кодировка строки — UTF-8. Если вам нужно обработать разные кодировки, вы можете написать свой обработчик многобайтовых строк и настроить его через ActiveSupport::Multibyte.proxy_class.
class CharsForUTF32
def size
@wrapped_string.size / 4
end
def self.accepts?(string)
string.length % 4 == 0
end
end
ActiveSupport::Multibyte.proxy_class = CharsForUTF32
Атрибуты
Публичные методы класса
# File activesupport/lib/active_support/multibyte/chars.rb, line 77 def self.consumes?(string) string.encoding == Encoding::UTF_8 end
Возвращает true, когда класс-прокси может обработать строку. Возвращает false в противном случае.
# File activesupport/lib/active_support/multibyte/chars.rb, line 53 def initialize(string) @wrapped_string = string @wrapped_string.force_encoding(Encoding::UTF_8) unless @wrapped_string.frozen? end
Создает новый экземпляр Chars, обернув строку.
Публичные методы экземпляра
# File activesupport/lib/active_support/multibyte/chars.rb, line 146
def capitalize
(slice(0) || chars("")).upcase + (slice(1..-1) || chars("")).downcase
end Преобразует первый символ в верхний регистр, а остальные — в нижний.
'über'.mb_chars.capitalize.to_s # => "Über"
# File activesupport/lib/active_support/multibyte/chars.rb, line 182
def compose
chars(Unicode.compose(@wrapped_string.codepoints.to_a).pack("U*"))
end Выполняет композицию над всеми символами.
'é'.length # => 3 'é'.mb_chars.compose.to_s.length # => 2
# File activesupport/lib/active_support/multibyte/chars.rb, line 174
def decompose
chars(Unicode.decompose(:canonical, @wrapped_string.codepoints.to_a).pack("U*"))
end Выполняет каноническое разложение над всеми символами.
'é'.length # => 2 'é'.mb_chars.decompose.to_s.length # => 3
# File activesupport/lib/active_support/multibyte/chars.rb, line 132 def downcase chars Unicode.downcase(@wrapped_string) end
Преобразует символы в строке в нижний регистр.
'VĚDA A VÝZKUM'.mb_chars.downcase.to_s # => "věda a výzkum"
# File activesupport/lib/active_support/multibyte/chars.rb, line 190 def grapheme_length Unicode.unpack_graphemes(@wrapped_string).length end
Возвращает количество кластеров графем в строке.
'क्षि'.mb_chars.length # => 4 'क्षि'.mb_chars.grapheme_length # => 3
# File activesupport/lib/active_support/multibyte/chars.rb, line 118 def limit(limit) slice(0...translate_offset(limit)) end
Ограничивает размер строки в байтах, не разрывая символы. Используется, когда хранение строки ограничено по какой-либо причине.
'こんにちは'.mb_chars.limit(7).to_s # => "こん"
# File activesupport/lib/active_support/multibyte/chars.rb, line 59
def method_missing(method, *args, &block)
result = @wrapped_string.__send__(method, *args, &block)
if /!$/.match?(method)
self if result
else
result.kind_of?(String) ? chars(result) : result
end
end Перенаправляет все неопределенные методы на обернутую строку.
# File activesupport/lib/active_support/multibyte/chars.rb, line 166 def normalize(form = nil) chars(Unicode.normalize(@wrapped_string, form)) end
По умолчанию возвращает KC нормализацию строки. NFKC считается лучшей формой нормализации для передачи строк в базы данных и валидации.
-
form- Форма, которую вы хотите нормализовать. Должна быть одной из следующих::c,:kc,:d, или:kd. По умолчанию ActiveSupport::Multibyte::Unicode#default_normalization_form
# File activesupport/lib/active_support/multibyte/chars.rb, line 71 def respond_to_missing?(method, include_private) @wrapped_string.respond_to?(method, include_private) end
Возвращает true если obj отвечает на данный метод. Приватные методы включаются в поиск только если необязательный второй параметр равен true.
# File activesupport/lib/active_support/multibyte/chars.rb, line 109
def reverse
chars(Unicode.unpack_graphemes(@wrapped_string).reverse.flatten.pack("U*"))
end Инвертирует все символы в строке.
'Café'.mb_chars.reverse.to_s # => 'éfaC'
# File activesupport/lib/active_support/multibyte/chars.rb, line 99
def slice!(*args)
string_sliced = @wrapped_string.slice!(*args)
if string_sliced
chars(string_sliced)
end
end Работает как String#slice!, но возвращает экземпляр Chars, или nil если строка не была изменена. Строка не будет изменена, если указанный диапазон выходит за пределы.
string = 'Welcome' string.mb_chars.slice!(3) # => #<ActiveSupport::Multibyte::Chars:0x000000038109b8 @wrapped_string="c"> string # => 'Welome' string.mb_chars.slice!(0..3) # => #<ActiveSupport::Multibyte::Chars:0x00000002eb80a0 @wrapped_string="Welo"> string # => 'me'
# File activesupport/lib/active_support/multibyte/chars.rb, line 86
def split(*args)
@wrapped_string.split(*args).map { |i| self.class.new(i) }
end Работает точно так же, как String#split, за исключением того, что элементы в результирующем списке — это экземпляры Chars вместо String. Это облегчает цепочку вызовов методов.
'Café périferôl'.mb_chars.split(/é/).map { |part| part.upcase.to_s } # => ["CAF", " P", "RIFERÔL"]
# File activesupport/lib/active_support/multibyte/chars.rb, line 139 def swapcase chars Unicode.swapcase(@wrapped_string) end
Преобразует символы в строке в противоположный регистр.
'El Cañón'.mb_chars.swapcase.to_s # => "eL cAÑÓN"
# File activesupport/lib/active_support/multibyte/chars.rb, line 199 def tidy_bytes(force = false) chars(Unicode.tidy_bytes(@wrapped_string, force)) end
Заменяет все символы ISO-8859-1 или CP1252 их эквивалентами UTF-8, что приводит к валидной UTF-8 строке.
Передача true принудительно приведет к очистке всех байтов, предполагая, что кодировка строки полностью CP1252 или ISO-8859-1.
# File activesupport/lib/active_support/multibyte/chars.rb, line 154
def titleize
chars(downcase.to_s.gsub(/\b('?\S)/u) { Unicode.upcase($1) })
end Преобразует первую букву каждого слова в заглавную, если это возможно.
"ÉL QUE SE ENTERÓ".mb_chars.titleize.to_s # => "Él Que Se Enteró" "日本語".mb_chars.titleize.to_s # => "日本語"
# File activesupport/lib/active_support/multibyte/chars.rb, line 125 def upcase chars Unicode.upcase(@wrapped_string) end
Преобразует символы в строке в верхний регистр.
'Laurent, où sont les tests ?'.mb_chars.upcase.to_s # => "LAURENT, OÙ SONT LES TESTS ?"
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.