2017-01-27 7 views
1

Я пытаюсь преобразовать некоторые однобайтовые символы в многобайтовые символы, используя tr.Многобайтовые символы и команда tr

Когда у меня есть только один символ преобразования, конверсионные работы:

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

, но если добавить еще несколько символов, символы не обнаружены:

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

Почему, и как Можно ли конвертировать многобайтовые символы?

Я использую Ruby 2.3.3. Кроме того, я получаю:

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

Является ли это ошибкой Ruby?

+0

Вы уверены, что вы находитесь в режиме UTF-8? – tadman

+0

Да. Я использую Ruby 2.3.3. Кроме того, кодировка «' '\\" .кодирование => # <Кодировка: UTF-8> irb (main): 007: 0> "\\ ¥ '". Encoding => # <Кодировка: UTF- 8> irb (main): 008: 0> "\ ¥ '". Encoding => # <Кодирование: UTF-8> '' ' – sawa

+1

Это может быть ошибка в' tr', поэтому вы можете изучить с командой Ruby. Похоже, что он работает, если вы переместите символ обратной косой черты в конец набора в 'tr', поэтому, возможно, что-то во внутренней реализации путается им. – tadman

ответ

2

Буквальная обратная косая черта должна быть последней. Из documentation: (курсив)

Символ обратной косой черты \ может быть использован, чтобы избежать ^ или - и иначе игнорируется, если он не появится в конце диапазона или конец from_str или to_str:

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

эквивалентно:

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

Versus:

"\\abc".tr("abc\\", "def/") #=> "/def" 
Смежные вопросы