Я исправляю некоторые домашние задания от студентов, у которых в именах есть акцентированные символы (не мой родной язык), и по глупости решил соблюдать фактическое написание их имен при создании файлов с моими комментариями (Firstname.Lastname
). В общем, я создал имена файлов (в консоли или в Emacs, используя ключ Compose (например, compose-'-a
для генерации). Это привело к следующему несоответствию между ОС и R list.files()
:
system("touch testá") ## create file with accented character in name
list.files(pattern="test") ## it's there ...
## [1] "testá"
Но когда я пытаюсь сопоставить все слово в аргументе pattern
...
list.files(pattern="testá")
## character(0)
Это на Xubuntu 16.04, но это виртуальная машина, поэтому основной файловой системой является HFS. Моя нормальная локаль
[1] "LC_CTYPE=en_CA.UTF8;LC_NUMERIC=C;LC_TIME=en_CA.UTF8;LC_COLLATE=en_CA.UTF8;LC_MONETARY=en_CA.UTF8;LC_MESSAGES=en_CA.UTF8;LC_PAPER=en_CA.UTF8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_CA.UTF8;LC_IDENTIFICATION=C"
но переключение через Sys.setlocale("LC_ALL","pl_PL.UTF8")
(что, очевидно, успешно) не помогает.
Что действительно странно (для меня), это то же самое упражнение с «testł» работает ...
Как предлагается в комментариях, я немного больше изучил с charToRaw
. Фактически существует разница между строковым представлением в R и именем, хранящимся на диске:
charToRaw("testá")
## [1] 74 65 73 74 c3 a1
charToRaw(list.files(pattern="test"))
## [1] 74 65 73 74 61 cc 81