Строки ruby, которые возвращают true для #ascii_only? подмножество строк, которые возвращают true для # is_utf8 Activesupport? - PullRequest
1 голос
/ 15 февраля 2020

У меня есть требование определить, является ли очень большое количество символов неизвестной кодировки utf8. Я использую ActiveSupport # is_utf8? , однако он работает довольно медленно, потому что дублирует строку. Мне интересно, могу ли я поставить охранное предложение, используя # ascii_only . Мои тесты показывают, что это улучшит производительность моего utf8? method.

Исходный метод:

def utf8? character
  character.is_utf8?
end

Более быстрый метод:

def utf8? character
  return true if character.ascii_only?
  character.is_utf8?
end

Есть ли символ, который вернет false для ActiveSupport String # is_utf8? , который вернет true для String # ascii_only ?

1 Ответ

1 голос
/ 15 февраля 2020

Есть ли символ, который будет возвращать false для строки ActiveSupport # is_utf8? [and] true для String # ascii_only?

Согласно определению UTF-8, такого символа нет.

Первые 128 символов Unicode .. соответствует один к одному с ASCII (https://en.m.wikipedia.org/wiki/UTF-8)

Но соответствуют ли эти функции этому определению? Да, они делают. :)

ascii_only? возвращает true только для символов 0..127, независимо от того, какую кодировку мы указываем.

127.chr(Encoding::ASCII_8BIT).ascii_only? #=> true
128.chr(Encoding::ASCII_8BIT).ascii_only? #=> false
127.chr(Encoding::UTF_8).ascii_only? #=> true
128.chr(Encoding::UTF_8).ascii_only? #=> false

Теперь давайте посмотрим на is_utf8?. Чтобы ответить на наш вопрос, нам нужно рассмотреть только символы 0..127.

(0..127).any? { |i| !i.chr(Encoding::ASCII_8BIT).is_utf8? }
#=> false

. В диапазоне 0..127 нет символов, для которых is_utf8? возвращает false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...