Автоматический перевод utf-8 в ascii с использованием stringi и stringr в R — ошибка с escape-символом \u

Я изо всех сил пытаюсь автоматически перевести utf-8 в буквы ascii.

Во фрейме данных у меня есть следующая последовательность, которая происходит от греческих букв:

<U+03A0><U+0391><U+039D><U+0391>G

Вручную преобразовав последовательность в

\u03A0\u0391\u039D\u0391G

Я получил правильную транскрипцию, используя stringi с помощью этой команды:

t <- "\u03A0\u0391\u039D\u0391G" # original "ΠΑΝΑΓ"
t <- stri_trans_general(t,"any-latin")
t <- stri_trans_general(t,"latin-ascii")
print(t)
[1] "PANAG"

Теперь я хочу автоматизировать перевод с помощью stringr, используя:

t2 <- "<U+03A0><U+0391><U+039D><U+0391>G"
t2 <- str_replace_all(t2,">","")
t2 <- str_replace_all(t2,"<U+","\\u") # double \\ for the escape character

Результат:

[1] "+03A0+0391+039D+0391G"

Который нельзя перевести с помощью stringi

Может возникнуть вопрос, как перевести исходную строку utf-8 через stringr и stringi в буквы ascii, так как в моем фрейме данных много этих строковых последовательностей?

Я использую RStudio версии 0.99.825 на R.

R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale: [1] LC_COLLATE=German_Austria.1252

RStudio и R работают как переносные приложения.

заранее спасибо

С уважением

Маркус


person Markus Maly    schedule 22.12.2015    source источник


Ответы (1)


Причина, по которой t2 <- str_replace_all(t2,"<U+","\u") не работает, заключается в том, что \u запускает символ Юникода, а R ожидает шестнадцатеричный код символа после \u. Поэтому вам нужно использовать \\\\u, который вставляет строку "\u" (вам нужно дважды экранировать: один раз для R и один раз для gsub). Однако тогда вы получите строку "\u03A0", которая не совпадает со строкой "\u03A0", введенной в консоли/полученной из файла. Трюк, который я использовал ниже, заключается в разборе строки.

Вероятно, должен быть более простой способ сделать это, но работает следующее:

 library(stringi)

str <- "<U+03A0><U+0391><U+039D><U+0391>G"

t <- gsub("<U\\+", "\\\\u", str)
t <- gsub(">", "", t)
t <- eval(parse(text=paste0('"', t, '"')))

t <- stri_trans_general(t,"any-latin")
stri_trans_general(t,"latin-ascii")
person Jan van der Laan    schedule 22.12.2015