Объединение текста слева направо (LTR) и справа налево (RTL)

Кажется, что объединение текста слева направо (LTR) и справа налево (RTL) с использованием paste может привести к неожиданным результатам для полученного порядка:

(x = paste(c('green', 'أحمر', 'أزرق'), collapse=' ')) # arabic for blue and red
#> [1] "green أحمر أزرق"
paste(x, 'yellow')
#> [1] "green أحمر أزرق yellow"
paste(x, 123)
#> [1] "green أحمر أزرق 123"

Есть ли какое-либо известное решение для этого, то есть способ обеспечить конкатенацию в той же последовательности, что и аргументы? Возможно, ответ таков: не объединяйте разные алфавиты!


person geotheory    schedule 14.07.2017    source источник
comment
Даже ввод x = paste(c('green',<foreign text>, 123, collapse=' ')) в текстовом редакторе вызывает аналогичную проблему. Я даже не могу правильно отформатировать здесь...   -  person CPak    schedule 14.07.2017
comment
Я не уверен, но это связано с тем, что числа всегда кодируются как LTR (слева направо), поэтому это 123. Но в случае арабского языка он добавляется слева от арабского текста, поэтому позже в арабском тексте.   -  person m0nhawk    schedule 14.07.2017


Ответы (1)


Вы можете использовать управляющие символы Unicode 'встраивание слева направо', u202A (" Рассматривайте следующий текст как встроенный слева направо"):

paste(x, "\u202A", 123)
# [1] "green أحمر أزرق ‭ 123"

См. также Завершение явных направленных внедрений и переопределений, (u202C), подробное описание ДВУНАПРАВЛЕННЫЙ АЛГОРИТМ UNICODE и здесь.

person Henrik    schedule 14.07.2017
comment
Хорошо смажьте мой пастернак. [U+1F4AA] - person geotheory; 14.07.2017