2011-12-26 45 views
5

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

+0

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

Respuesta

8

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.

+0

"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. –

+0

¿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?' –

+0

'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. –

1
"your string".encoding 
# => #<Encoding:UTF-8> 

O si lo desea progmatically,

"your string".encoding.name == "UTF-8" 
# => true 
+5

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. –

6

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 o ISO-8859-1. Por lo tanto, el fragmento de código anterior no funciona al revés, es decir, detecta si una cadena es válida CP1252 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 otros Latin1 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 de CP1252 (a.k.a. Windows-1252).Ejemplos: ISO-8859-1, ISO-8859-15

+0

'" 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_. –

+0

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? –

+0

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'. –

Cuestiones relacionadas