2013-12-08 6 views
11

В Юникоде буквы с акцентами могут быть представлены двумя способами: самой подчеркнутой буквой и комбинацией голой буквы с акцентом. Например, é (+ U00E9) и e'(+ U0065 + U0301) обычно отображаются одинаково.Нормализация Юникода (форма C) в R: преобразовать все символы с акцентами в их одно-кодировку символов?

R оказывает следующее (версии 3.0.2, Mac OS 10.7.5):

> "\u00e9" 
[1] "é" 
> "\u0065\u0301" 
[1] "é" 

Однако, конечно:

> "\u00e9" == "\u0065\u0301" 
[1] FALSE 

Есть функция в R, который преобразует буквы двух-юникодовых символов в их односимвольные формы? В частности, здесь он обрушится "\u0065\u0301" на "\u00e9".

Это было бы очень удобно обрабатывать большие количества струн. Кроме того, односимвольные формы могут быть легко преобразованы в другие кодировки через iconv - по крайней мере, для обычных символов Latin1 - и лучше обрабатываются plot.

Большое спасибо.

+0

Возможно, вы захотите опубликовать свое редактирование в качестве ответа. Таким образом, вопрос возникает, как ответ. Кроме того, IIRC, вы должны преобразовать в форму D, а не C, поскольку комбинированные символы немного взломаны. – krzysz00

+1

Спасибо! Возможно, вы правы в форме D вообще, хотя до сих пор форма C казалась более приспособленной к моей практике (например, 'iconv (" \ u0065 \ u0301 ", to =" ASCII // TRANSLIT ")' дает 'NA', тогда как 'iconv (normalize_C (" \ u0065 \ u0301 "), to =" ASCII // TRANSLIT ")' дает '' 'e' ', а' plot' лучше печатает метки в форме C). Я постараюсь узнать больше о плюсах и минусах. – AlxH

+0

@AlxH ты спас мой день - спасибо! – marsei

ответ

8

ОК, похоже, что пакет был разработан для улучшения и упрощения инструментария манипуляции строками в R (наконец!). Он называется stringi и выглядит очень многообещающим. Его documentation очень хорошо написан, и в частности я нахожу страницы о encodings и locales гораздо более просветительскими, чем некоторые из стандартных R documentation on the subject.

Она имеет функции нормализации Unicode, как я искал (здесь форма C):

> stri_trans_nfc('\u00e9') == stri_trans_nfc('\u0065\u0301') 
[1] TRUE 

Он также содержит умный comparison function, который объединяет эти нормировки вопросы и уменьшает боль от того, чтобы думать о них:

> stri_compare('\u00e9', '\u0065\u0301') 
[1] 0 
# i.e. equal ; 
# otherwise it returns 1 or -1, i.e. greater or lesser, in the alphabetic order. 

Благодаря разработчикам, Marek Gągolewski и Бартек Tartanus и Курту Hornik за информацию!

+2

stringi теперь включен в [CRAN] (http://cran.r-project.org/web/packages/stringi/). – gagolews

+2

Так как я нашел ваш ответ, когда Google для замены умлаута на немецком OSX в R с помощью 'iconv()', может быть достоин, что с пакетом 'stringi' это просто одна функция: ' stringi :: stri_trans_general (c (" äöüø ")," латино-ASCII ")' – zerweck