Есть ли символ, который будет возвращать 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.