Как я могу узнать представление внутреннего кода символа WINDOWS-1252? - PullRequest
8 голосов
/ 05 марта 2011

Я обрабатываю данные SPSS из анкеты, которая должна быть создана в M $ Word.Word автоматически превращает дефисы в длинные дефисы и преобразуется в символы, которые не отображаются должным образом, то есть «-» превращается в «ú».

Мой вопрос: что эквивалентно utf8ToInt ()в наборе символов WINDOWS-1252?

utf8ToInt("A")
[1] 65

Когда я делаю это с моими собственными данными, я получаю сообщение об ошибке:

x <- str_sub(levels(sd$j1)[1], 7, 7)
print(x)
[1] "ú"

utf8ToInt(x)
Error in utf8ToInt(x) : invalid UTF-8 string

Однако содержимое xотлично подходит для выражений grep и gsub.

> Sys.getlocale()
[1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"

Ответы [ 3 ]

5 голосов
/ 12 марта 2011

После некоторого почесывания головы, большого количества чтения справочных файлов и проб и ошибок я создал две маленькие функции, которые делают то, что мне нужно. Эти функции работают путем преобразования их входных данных в UTF-8 и последующего возврата целочисленного вектора для кодированного вектора символов UTF-8, и наоборот.

# Convert character to integer vector
# Optional encoding specifies encoding of x, defaults to current locale
encToInt <- function(x, encoding=localeToCharset()){
    utf8ToInt(iconv(x, encoding, "UTF-8"))
}

# Convert integer vector to character vector
# Optional encoding specifies encoding of x, defaults to current locale
intToEnc <- function(x, encoding=localeToCharset()){
    iconv(intToUtf8(x), "utf-8",  encoding)
}

Некоторые примеры:

x <- "\xfa"
encToInt(x)
[1] 250

intToEnc(250)
[1] "ú"
5 голосов
/ 05 марта 2011

Если вы загрузите файл SPSS sav через read.spss пакет форм Foreign , вы можете легко импортировать фрейм данных с правильной кодировкой, указав кодировку, например:

read.spss("foo.sav", reencode="CP1252")
0 голосов
/ 06 июня 2016

Я использую вариант кода Андри:

  • Векторизация x, чтобы я мог применить его к вектору / столбцу символов
  • Который обрабатывает символ, закодированный двумя символами utf8 (например, \ u0098, который дает c (194, 152)), просто возвращая последнее целое число кодирования

Это полезно, когда, например, для отображения символов latin1 / cp1252 в целочисленный диапазон, который является моим приложением («более компактный формат файла», говорят они). Это явно не подходит, если вам нужно преобразовать целое число обратно в символ в какой-то момент.

encToInt <- Vectorize(
  function(x, encoding){
    out <- utf8ToInt(iconv(x, encoding, "UTF-8"))
    out[length(out)]
  },
  vectorize.args="x", USE.NAMES = F, SIMPLIFY=T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...