Estoy empezando a aprender Ruby (para pasar a RoR), pero me dijeron que Ruby no es compatible con Unicode. ¿Es verdad? ¿Cómo los programadores de Ruby van sobre apoyar unicode?¿Ruby admite unicode y cómo funciona?
Respuesta
Lo que oyó está desactualizado y se aplica (solo parcialmente) a Ruby 1.8 o versiones anteriores. La última versión estable de Ruby (1.9) admite no menos de codificaciones de caracteres diferentes (contadas en mi sistema en este momento). Esto incluye prácticamente todos los formatos de transformación Unicode conocidos, incluido UTF-8.
La versión estable anterior de Ruby (1.8) tiene compatibilidad parcial para UTF-8.
Si usa Rails, se encarga de la codificación UTF-8 predeterminada. Si todo lo que necesita es conocimiento de codificación UTF-8, Rails funcionará para usted sin importar si ejecuta Ruby 1.9 o Ruby 1.8. Si tiene requisitos de codificación de caracteres muy específicos, debe apuntar a Ruby 1.9.
Si está realmente interesado, aquí hay un series of articles que describe los problemas de codificación en Ruby 1.8 y cómo se solucionaron, y finalmente se resolvió en Ruby 1.9. Rails todavía incluye soluciones provisionales para muchos defectos comunes en Ruby 1.8.
Eso no es verdad. Lo que es cierto es que Ruby no admite solo Unicode, también admite una gran cantidad de otras codificaciones.
Esto está en contraste con los sistemas como Java, .NET o Python, que siguen el modelo "Una codificación para gobernarlos a todos". Ruby tiene lo que uno de los diseñadores del sistema m17n de Ruby llama un modelo "CSI" (Code Set Indepedent), lo que significa que en lugar de todas las cadenas que solo tienen una y la misma codificación, cada cadena está etiquetada con su propia codificación.
Esto tiene algunas ventajas significativas tanto por su facilidad de uso como por su rendimiento, porque significa que si sus codificaciones de entrada y salida son iguales, nunca necesita transcodificar, mientras que con el modelo One True Encoding, necesita transcodificar dos veces en el peor de los casos (y ese peor caso desafortunadamente ocurre con bastante frecuencia, porque la mayoría de estos entornos eligen una codificación interna que nadie usa realmente), desde la codificación de entrada a la codificación interna y luego a la codificación de salida. En Ruby, necesitas transcodificar como máximo una vez.
El problema básico con el modelo OTE es que cualquiera que sea la codificación que elija como One True Encoding, será una elección completamente arbitraria, ya que simplemente no hay una sola codificación que use todo el mundo, o incluso la mayoría.
En Java, por ejemplo, eligieron UCS-2 como One True Encoding. Luego, un par de años más tarde, resultó que UCS-2 en realidad no era suficiente para codificar todos los caracteres, por lo que tuvieron que hacer un cambio incompatible con Java, para cambiar a UTF-16 como la codificación de One True. Excepto en ese momento, una porción significativa del mundo había pasado de UTF-16 a UTF-8. Si Java se hubiera inventado un par de años antes, probablemente hubieran elegido ASCII como One True Encoding. Si se hubiera inventado en otro país, podría ser Shift-JIS. Si hubiera sido inventado por otra empresa, podría ser EBCDIC. Es realmente completamente arbitrario, y una opción tan importante no debería ser ser.
Muy interesante, muchas gracias! –
Unicode no es una codificación – tchrist
@tchrist: Es una codificación en el sentido de que asigna un * número * único para cada carácter (que es más o menos la definición del diccionario de "codificación" "). No es una codificación en el sentido de que no asigna un * patrón de bits * único para cada personaje (en jerga Unicode, ese es el trabajo del formato de transferencia). Lamentablemente, nunca he podido aparecer con un buen nombre para lo que es Unicode, aparte de "codificación". –
En this answer a una pregunta diferente, una persona dijo que tenía problemas con Iconv cuando manejaba datos Unicode en Ruby 1.9, pero no puedo garantizar su precisión.
Agregando la siguiente línea en la parte superior mi archivo lo resolvió.
# encoding: utf-8
encima de qué ??? –
En la parte superior del archivo de código fuente. – Kannaiyan
Sí, justo después de la línea [http://en.wikipedia.org/wiki/Shebang_(Unix)]. –
Esta es una pregunta muy antigua. La versión estable actual de Ruby es 2.0.1. Sí, maneja más de lo que puede lanzar en Unicode, pero tenga en cuenta que se rompe con bastante facilidad.
Tome un vistazo a este ejemplo de código y los resultados (inspirado en this):
["noël","","baffle"].each do |str|
puts "Result for '#{str}'"
puts " Size: #{str.size}"
puts " Reverse: [#{str.reverse}]"
puts " Uppercase: [#{str.upcase}]"
end
Result for 'noël'
Size: 5 << bad size
Reverse: [l̈eon] <= accent is shifted
Uppercase: [NOËL]
Result for ''
Size: 2
Reverse: []
Uppercase: []
Result for 'baffle'
Size: 4
Reverse: [efflab] <= doesn't really make sense
Uppercase: [BAfflE] <= should be "ELFFAB"
El punto es: Rubí moderna maneja los conceptos básicos - Características de la secuencia más avanzados no se deben contar.
No recibí tu comentario. ¿Por qué 'e ffl ab' es lo contrario de' baff e' tiene sentido? ¿O por qué la mayúscula de 'ba ffl e' debe ser' ELFFAB'? – eis
inversa de 'deflector' debe ser' elffab', no 'efflab' :-) – kralyk
@kralyk @GregPK Parece que' baff e e 'se trata correctamente, teniendo en cuenta que ffl es un carácter único. Realmente tiene sentido. :) – ray
- 1. Unicode con Cygwin y MinTTY no funciona
- 2. ¿PCRE admite la cadena Unicode correctamente?
- 3. Cadenas Unicode en Ruby 1.9
- 4. Ruby on Rails. Rutas Unicode
- 5. Ruby 1.9 no es compatible con la normalización Unicode aún
- 6. ¿Cómo funciona el encadenamiento Ruby?
- 7. ¿Cómo funciona string.unpack en Ruby?
- 8. ¿Cómo funciona Ruby on Rails?
- 9. Ruby JSON.parse devolviendo datos incorrectos para unicode
- 10. ¿Cómo reemplazar la gema Unicode en Ruby 1.9?
- 11. Cadena de Ruby # caracteres gsub, unicode y sin palabra
- 12. ¿Objective-C admite Mixin como Ruby?
- 13. convertir unicode en personaje con ruby
- 14. ¿Admite python 3.1.3 unicode en el módulo csv?
- 15. ruby: valor decimal de carácter unicode a \ uXXXX conversión? El método .ord no funciona
- 16. En Ruby, ¿qué significa "=>" y cómo funciona?
- 17. ¿Cómo hacer coincidir palabras unicode con ruby 1.9?
- 18. Python y Unicode: ¿Cómo debería ser todo lo Unicode
- 19. Caracteres Unicode en un script de Ruby?
- 20. Cómo especificar Regexp de caracteres Unicode cirílico en Ruby 1.9
- 21. ¿Cómo puedo escapar de una cadena Unicode con Ruby?
- 22. Cómo obtener el Unicode del personaje en Ruby 1.8.7?
- 23. En Ruby, ¿cómo funciona realmente Coerce()?
- 24. Regex y Unicode
- 25. ¿Cómo funciona la iteración en Ruby?
- 26. Python: Unicode y ElementTree.parse
- 27. wWinmain, Unicode y Mingw
- 28. C++ UNICODE y STL
- 29. Cadena Unicode y TStringStream
- 30. GCC, Unicode y __FUNCTION__
para cualquier persona como yo que busque un acceso directo a un equivalente de $ KCODE para el cambio de codificación por defecto programático, lo que quiere es: Encoding.default_internal = 'utf-8' # Encoding.list.map (&: names) – Travis
Link's dead. :( – user2357112