заменить специальные символы на окнах - PullRequest
0 голосов
/ 31 января 2019

Ученики обычно вставляют вопросы задания из документа PDF или Word в Rmarkdown.Тем не менее, вставленный текст часто содержит символы не ascii для маркеров, кавычек и т. Д. Я использовал gsub в прошлом как часть функции для замены таких символов, и это, казалось, работало нормально, но сейчас я сталкиваюсь с проблемамиснова.

Первая строка в каждой паре, показанной ниже, работает на macOS, Linux и Windows.Однако не-ascii символы не допускаются в коде для включения в пакет R.2-я строка в каждой паре работает в macOS и Linux, но не в Windows.

Было бы замечательно иметь общий подход к работе с символами такого типа, который не предполагает их простого удаления.

gsub("•", "*", "A big dot •")
gsub("\xE2\x80\xA2", "*", "A big dot •")

gsub("…", "...", "Some small dots …")
gsub("\xE2\x80\xA6", "...", "Some small dots …")

gsub("–", "-", "A long-dash –")
gsub("\xE2\x80\x93", "-", "A long-dash –")

gsub("’", "'", "A curly single quote ’")
gsub("\xE2\x80\x99", "'", "A curly single quote ’")

gsub("‘", "'", "A curly single quote ‘")
gsub("\xE2\x80\x98", "'", "A curly single quote ‘")

gsub("”", '"', "A curly double quote ”")
gsub("\xE2\x80\x9D", '"', "A curly double quote ”")

gsub("“", '"', "A curly double quote “")
gsub("\xE2\x80\x9C", '"', "A curly double quote “")

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Похоже, что в системах с настройками языка, отличным от американского, gsub("[\x95\xE2\x80\xA2]", "*", "A big dot •") может вызвать ошибки (см., Например, ниже).

> gsub("[\x95\xE2\x80\xA2]", "*", "A big dot •") 
Error in gsub("[曗€", "*", "A big dot <U+2022>") : 
  invalid regular expression '[曗€', reason 'Missing ']''

Следующее, однако, хорошо работает.

gsub("\u2022", "*", "A big dot •")
gsub("\u2026", "...", "Some small dots …")
gsub("\u2013", "-", "A long-dash –")
gsub("\u2019", "'", "A curly single quote ’")
gsub("\u2018", "'", "A curly single quote ‘")
gsub("\u201D", '"', "A curly double quote ”")
gsub("\u201C", '"', "A curly double quote “")

Кроме того, stringi::stri_trans_general хорошо работает в системах с настройками языка США, но в системе с настройками китайского языка кодпоказанный ниже не возвращает желаемый результат, который просто 夹.Не уверен, что решение.

stringi::stri_trans_general("夹", "ascii")
> stringi::stri_trans_general("夹", "ascii")
[1] " 1/4D"
0 голосов
/ 31 января 2019

Мы можем проверить шестнадцатеричное кодирование символа с помощью функции Encoding:

x <- c("•", "…", "–", "’", "‘", "”", "“")
y <- x

Encoding(y) <- "bytes"

> x
[1] "•" "…" "–" "’" "‘" "”" "“"

> cat(y)
\x95 \x85 \x96 \x92 \x91 \x94 \x93

Затем мы можем включить шестнадцатеричные коды в ваши gsub:

gsub("•", "*", "A big dot •")
gsub("[\x95\xE2\x80\xA2]", "*", "A big dot •")

gsub("…", "...", "Some small dots …")
gsub("[\x85\xE2\x80\xA6]", "...", "Some small dots …")

gsub("–", "-", "A long-dash –")
gsub("[\x96\xE2\x80\x93]", "-", "A long-dash –")

gsub("’", "'", "A curly single quote ’")
gsub("[\x92\xE2\x80\x99]", "'", "A curly single quote ’")

gsub("‘", "'", "A curly single quote ‘")
gsub("[\x91\xE2\x80\x98]", "'", "A curly single quote ‘")

gsub("”", '"', "A curly double quote ”")
gsub("[\x94\xE2\x80\x9D]", '"', "A curly double quote ”")

gsub("“", '"', "A curly double quote “")
gsub("[\x93\xE2\x80\x9C]", '"', "A curly double quote “")

Также с stri_trans_general из stringi:

library(stringi)
stri_trans_general(x, "ascii")
# [1] "•"   "..." "-"   "'"   "'"   "\""  "\""

Кажется, это не работает для "•", но работает для остальных.

Обратите внимание, что я только что проверил эторешение на Windows, а не на других ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...