Cómo comprobar si el conjunto de caracteres está en codificación utf-8, a través de ruby | ror?Cómo comprobar si el carácter es utf-8
Respuesta
No hay manera definitiva a ello, en Ruby, ni en ningún otro lugar:
str = 'foo' # start with a simple string
# => "foo"
str.encoding
# => #<Encoding:UTF-8> # which is UTF-8 encoded
str.bytes.to_a
# => [102, 111, 111] # as you can see, it consists of three bytes 102, 111 and 111
str.encode!('us-ascii') # now we will recode the string to 8-bit us-ascii encoding
# => "foo"
str.encoding
# => #<Encoding:US-ASCII>
str.bytes.to_a
# => [102, 111, 111] # see, same three bytes
str.encode!('windows-1251') # let us try some cyrillic
# => "foo"
str.encoding
# => #<Encoding:Windows-1251>
str.bytes.to_a
# => [102, 111, 111] # see, the same three again!
Por supuesto, se puede emplear alguna estadística análisis en el texto, y eliminar codificaciones para las cuales el texto no es válido, pero teóricamente, este no es un problema solucionable.
"No hay una manera definida de hacerlo, en Ruby ni en ningún otro lado", ah, dijo como una amarga soldadura de las guerras Unicode. He estado allí, hecho eso, siento tu dolor. :-) También recurrí al análisis estadístico del texto, que funcionó, un poco, la mayor parte del tiempo. Es sorprendente lo mal que se puede romper HTML, RSS y XML cuando alguien está decidido a hacer que las cosas funcionen sin tener en cuenta las especificaciones. –
¿Qué pasa con [String # valid_encoding?] (Http://ruby-doc.org/core-2.1.0/String.html#method-i-valid_encoding-3F)? Ejemplo: '" Codificación parcialmente válida \ xE4 UTF-8: äöüß ".valid_encoding?' –
'valid_encoding?' Verifica si una cadena contiene secuencias de bytes no válidas. No dice si la secuencia de bytes (de lo contrario válida) se origina de cierta codificación, y creo que esa era la pregunta. –
"your string".encoding
# => #<Encoding:UTF-8>
O si lo desea progmatically,
"your string".encoding.name == "UTF-8"
# => true
Esto simplemente comprueba un conjunto de codificación en un objeto de cadena, no la codificación real de su contenido. No hay garantía de que el contenido real esté codificado usando la misma codificación. –
Comprobar UTF-8 Validez
Para la mayoría de las codificaciones multi-byte es posible detectar mediante programación byte-secuencias no válidas. Como Ruby de golosinas por defecto todas las cadenas que se van UTF-8
, se puede comprobar si una cadena se da en la válida UTF-8
:
# encoding: UTF-8
# -------------------------------------------
str = "Partly valid\xE4 UTF-8 encoding: äöüß"
str.valid_encoding?
# => false
str.scrub('').valid_encoding?
# => true
Convertir Codificación
Además, si una cadena no es válido UTF-8
codificación, pero sabes la codificación de caracteres real, puede convertir la cadena a la codificación UTF-8
.
Ejemplo
veces, terminan en una situación, en la que se sabe que la codificación de un archivo de entrada es UTF-8
o CP1252
(también conocido como Windows-1252
).
Compruebe qué codificación es y convertir a UTF-8 (si es necesario):
# encoding: UTF-8
# ------------------------------------------------------
test = "String in CP1252 encoding: \xE4\xF6\xFC\xDF"
File.open('input_file', 'w') {|f| f.write(test)}
str = File.read('input_file')
unless str.valid_encoding?
str.encode!('UTF-8', 'CP1252', invalid: :replace, undef: :replace, replace: '?')
end #unless
# => "String CP1252 encoding: äöüß"
=======
Notas
Es posible detectar mediante programación la mayoría de las codificaciones multibyte como UTF-8 (en Ruby, see: #valid_encoding?) con bastante alta confiabilidad. Después de solo 16 bytes, la probabilidad de que una secuencia de bytes aleatoria sea válida UTF-8 is only 0.01%. (Compárese esto con confiar en el UTF-8 BOM)
Sin embargo, no es fácilmente posible detectar mediante programación (en) validez de un solo byte-codificaciones como
CP1252
oISO-8859-1
. Por lo tanto, el fragmento de código anterior no funciona al revés, es decir, detecta si una cadena es válidaCP1252
codificación.A pesar de que UTF-8 se ha convertido cada vez más popular como la codificación predeterminada en la web,
CP1252
y otrosLatin1
sabores son todavía muy popular en los países occidentales, especialmente en América del Norte. Tenga en cuenta que hay varias codificaciones de un solo byte que son muy similares, pero varían ligeramente deCP1252
(a.k.a.Windows-1252
).Ejemplos:ISO-8859-1
,ISO-8859-15
'" Cadena en la codificación CP1252: \ xE4 \ xF6 \ xFC \ xDF "' Creo que la pregunta era _cómo se comprueba que está en codificación CP1252_. –
Pensé, la pregunta era si una cadena dada está en (válida) codificación 'UTF-8', o no. Para ello, llame a 'str.valid_encoding? 'En un String' str' que está en la codificación 'UTF-8'. ¿Eso no se aclara de mi respuesta? –
Programáticamente, no puede (o al menos no es fácil y por supuesto no confiable) verificar la invalidez de una cadena en una codificación de un byte, como 'CP1252'. Sin embargo, puede verificar con bastante fiabilidad (dependiendo de la longitud de la cadena) la invalidez de una cadena en una codificación de varios bytes, como 'UTF-8'. –
- 1. cómo comprobar si el carácter es un número entero
- 2. jQuery: comprobar si el carácter es en la cadena
- 3. cómo comprobar si la cadena contiene carácter '+'
- 4. comprobar si un solo carácter es un espacio en blanco?
- 5. Cómo comprobar si el GUID es cero
- 6. ¿Cómo comprobar si el archivo es binario?
- 7. Cómo comprobar si NSString comienza con un cierto carácter
- 8. ¿Cómo comprobar si un carácter está en mayúscula en Python?
- 9. Comprobar si es falso
- 10. cómo determinar si un carácter es un carácter chino
- 11. Cómo determinar si KeyCode es carácter imprimible
- 12. Compruebe si el carácter es una letra en Delphi (Unicode)
- 13. ¿Cómo comprobar si el elemento no es el primer hijo?
- 14. cómo comprobar si un carácter es igual a la comilla doble en java
- 15. Cómo comprobar si un carácter Java es un símbolo de moneda
- 16. ¿Cómo comprobar si un doble es nulo?
- 17. cómo comprobar si java.lang.reflect.Type es una enumeración
- 18. Cómo comprobar si request.GET var es None?
- 19. Cómo comprobar si JSONArray Element es nulo
- 20. ¿Cómo comprobar si un puntero es válido?
- 21. ¿Cómo comprobar si es sábado/domingo?
- 22. ¿Cómo comprobar si un carácter es un dígito o no en Objective-C?
- 23. Comprobar si boolean es verdadero
- 24. Cómo comprobar si el configurador de propiedades es público
- 25. ¿Cómo comprobar si el sistema operativo es Vista en Python?
- 26. Cómo comprobar si mi aplicación es el iniciador predeterminado
- 27. ¿Cómo comprobar si el navegador es compatible con HTML5?
- 28. ¿Cómo comprobar si el objeto es un elemento DOM?
- 29. ¿Cómo puedo comprobar si el día actual es día laborable
- 30. Java: cómo comprobar si el carácter pertenece a un bloque Unicode específico?
quiere usted decir si ya tiene la cadena en la memoria con la codificación correcta, o qué se refiere incluso antes de comenzar a leer la cadena en la memoria (por ejemplo, a partir de un archivo en el disco) ? – d11wtq