/ / Caracteres de múltiples bytes y comando tr - ruby, string, multibyte

Caracteres multi-byte y comando tr - ruby, string, multibyte

Estoy tratando de convertir algunos caracteres de un solo byte en caracteres de múltiples bytes usando tr.

Cuando tengo un solo carácter para convertir, la conversión funciona:

"\".tr("\", "\")
# => "\"

pero si agrego algunos caracteres más, los caracteres no se detectan:

"\".tr("\¥"", "\¥’")
# => "\"

¿Por qué es eso, y cómo puedo convertir caracteres de múltiples bytes?

Estoy usando Ruby 2.3.3. Además, obtengo:

"\".encoding #=> #<Encoding:utf-8>
"\¥"".encoding #=> #<Encoding:utf-8>
"\¥’".encoding #=> #<Encoding:utf-8>

Es este error de Ruby?

Respuestas

2 para la respuesta № 1

Una barra invertida literal debe venir en último lugar. Desde el documentación: (énfasis añadido)

El caracter de barra invertida se puede utilizar para escapar ^ o - y de lo contrario se ignora a menos que aparezca al final de un rango o el final de la from_str o to_str:

"\abc".tr("\abc", "/def") #=> "\/de"

es equivalente a:

"\abc".tr("abc", "/def") #=> "\/de"

Versus:

"\abc".tr("abc\", "def/") #=> "/def"