Spec-Zone.ru › Ruby on Rails 6.0

class ActiveSupport::Multibyte::Chars

Parent:
Объект
Included modules:

Chars позволяет работать с кодировкой UTF-8 в классе Ruby String прозрачно, без глубоких знаний о кодировке. Объект Chars принимает строку при инициализации и делегирует методы класса String безопасным образом с учётом кодировки. Все обычные методы класса String также реализованы для прокси.

Методы класса String делегируются объекту Chars и могут быть вызваны через метод mb_chars. Методы, которые обычно возвращают объект String, теперь возвращают объект Chars, что позволяет цепочку вызовов.

'The Perfect String  '.mb_chars.downcase.strip
# => #<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

Атрибуты

to_s[R]
to_str[R]
wrapped_string[R]

Публичные методы класса

consumes?(string) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 78
      def self.consumes?(string)
        ActiveSupport::Deprecation.warn(<<-MSG.squish)
          ActiveSupport::Multibyte::Chars.consumes? is deprecated and will be
          removed from Rails 6.1. Use string.is_utf8? instead.
        MSG

        string.encoding == Encoding::UTF_8
      end

Возвращает true , если класс прокси может обработать строку. В противном случае возвращает false.

new(string) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 54
def initialize(string)
  @wrapped_string = string
  @wrapped_string.force_encoding(Encoding::UTF_8) unless @wrapped_string.frozen?
end

Создаёт новый экземпляр Chars, обернув string.

Публичные методы экземпляра

compose() Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 177
def compose
  chars(Unicode.compose(@wrapped_string.codepoints.to_a).pack("U*"))
end

Выполняет композицию всех символов.

'é'.length                       # => 3
'é'.mb_chars.compose.to_s.length # => 2
decompose() Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 169
def decompose
  chars(Unicode.decompose(:canonical, @wrapped_string.codepoints.to_a).pack("U*"))
end

Выполняет каноническое разложение всех символов.

'é'.length                         # => 2
'é'.mb_chars.decompose.to_s.length # => 3
grapheme_length() Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 185
def grapheme_length
  @wrapped_string.scan(/\X/).length
end

Возвращает количество графемных кластеров в строке.

'क्षि'.mb_chars.length   # => 4
'क्षि'.mb_chars.grapheme_length # => 3
limit(limit) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 124
def limit(limit)
  truncate_bytes(limit, omission: nil)
end

Ограничивает размер строки количеством байтов без разрыва символов. Может быть полезно, когда хранилище для строки ограничено по каким-либо причинам.

'こんにちは'.mb_chars.limit(7).to_s # => "こん"
method_missing(method, *args, &block) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 60
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

Перенаправляет все неопределённые методы на обернутую строку.

normalize(form = nil) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 144
      def normalize(form = nil)
        form ||= Unicode.default_normalization_form

        # See https://www.unicode.org/reports/tr15, Table 1
        if alias_form = Unicode::NORMALIZATION_FORM_ALIASES[form]
          ActiveSupport::Deprecation.warn(<<-MSG.squish)
            ActiveSupport::Multibyte::Chars#normalize is deprecated and will be
            removed from Rails 6.1. Use #unicode_normalize(:#{alias_form}) instead.
          MSG

          send(:unicode_normalize, alias_form)
        else
          ActiveSupport::Deprecation.warn(<<-MSG.squish)
            ActiveSupport::Multibyte::Chars#normalize is deprecated and will be
            removed from Rails 6.1. Use #unicode_normalize instead.
          MSG

          raise ArgumentError, "#{form} is not a valid normalization variant", caller
        end
      end

По умолчанию возвращает KC нормализацию строки. NFKC считается лучшей формой нормализации для передачи строк в базы данных и валидации.

  • form — Форма, которую вы хотите нормализовать. Должна быть одной из следующих: :c, :kc, :d, или :kd. По умолчанию — ActiveSupport::Multibyte::Unicode#default_normalization_form

respond_to_missing?(method, include_private) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 72
def respond_to_missing?(method, include_private)
  @wrapped_string.respond_to?(method, include_private)
end

Возвращает true , если obj отвечает на данный метод. Приватные методы включаются в поиск только если опциональный второй параметр равен true.

reverse() Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 115
def reverse
  chars(@wrapped_string.scan(/\X/).reverse.join)
end

Инвертирует все символы в строке.

'Café'.mb_chars.reverse.to_s # => 'éfaC'
slice!(*args) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 105
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'
split(*args) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 92
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"]
tidy_bytes(force = false) Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 194
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.

titlecase()
Псевдоним для: titleize
titleize() Показать исходный код
# File activesupport/lib/active_support/multibyte/chars.rb, line 132
def titleize
  chars(downcase.to_s.gsub(/\b('?\S)/u) { $1.upcase })
end

Приводит к заглавной букве первого символа каждого слова, где это возможно.

"ÉL QUE SE ENTERÓ".mb_chars.titleize.to_s    # => "Él Que Se Enteró"
"日本語".mb_chars.titleize.to_s               # => "日本語"
Также алиас: titlecase

© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API