/ / Caracteres multi-byte e comando tr - ruby, string, multibyte

Caracteres multibyte e comando tr - ruby, string, multibyte

Eu estou tentando converter alguns caracteres de byte único em caracteres multi-byte usando tr.

Quando eu tenho apenas um caractere para converter, a conversão funciona:

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

mas se eu adicionar mais alguns caracteres, os caracteres não serão detectados:

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

Por que isso e como posso converter caracteres de múltiplos bytes?

Eu estou usando o Ruby 2.3.3. Além disso, recebo:

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

É esse bug do Ruby?

Respostas:

2 para resposta № 1

Uma barra invertida literal deve vir por último. De documentação: (enfase adicionada)

O caractere de barra invertida pode ser usado para escapar ^ ou - e é ignorado, a menos que apareça no final de um intervalo ou o fim do from_str ou to_str:

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

é equivalente a:

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

Versus:

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