¿Son verdaderas las cadenas de rubí que devuelven #ascii_only? ¿Un subconjunto de cadenas que devuelven verdadero para # is_utf8 de Activesupport?

2020-02-15 ruby-on-rails ruby utf-8

Tengo un requisito para determinar si una gran cantidad de caracteres de codificación desconocida son utf8. Estoy usando ActiveSupport # is_utf8? , sin embargo, es bastante lento porque duplica la cadena. Me pregunto si puedo poner una cláusula de guardia usando #ascii_only . ¿Mi prueba muestra que esto mejorará el rendimiento de mi utf8? método.

Método original:

def utf8? character
  character.is_utf8?
end

Método más rápido:

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

¿Hay un carácter que devuelva falso para la cadena # is_utf8 de ActiveSupport? que volverá verdadero para String # ascii_only ?

Answers

¿Hay un carácter que devuelva falso para la cadena # is_utf8 de ActiveSupport? [y] verdadero para String # ascii_only?

Según la definición de UTF-8, no existe tal carácter.

Los primeros 128 caracteres de Unicode ... corresponden uno a uno con ASCII ( https://en.m.wikipedia.org/wiki/UTF-8 )

Pero, ¿estas funciones respetan esta definición? Ellos si. :)

ascii_only? devuelve verdadero solo para los caracteres 0..127 , independientemente de la codificación que especifiquemos.

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

Ahora echemos un vistazo a is_utf8? . Para responder a nuestra pregunta, solo necesitamos considerar los caracteres 0..127 .

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

En el rango 0..127 , no hay caracteres para los cuales is_utf8? devuelve falso

Related