2016-10-04 5 views
0

Ich habe eine Textdatei, die eine Art von Fallback-Konvertierungen von Unicode-Zeichen enthält (die Unicode-Codepunkte in spitzen Klammern). So enthält es z.B. foo<U+017E>bar sollte "foošbar" sein. Gibt es einen einfachen Weg in R, um die ganze Datei in UTF8 umzuwandeln, wenn diese Zeichen konvertiert werden? Leider bin ich auf Windows und kann kein unterstütztes UTF-8-Gebietsschema finden.konvertieren utf8 Code-Punkt-Strings wie <U+0161> zu utf8

+0

UTF8 ist eine Codierung, * NOT * ein Gebietsschema. Windows verwendet seit mindestens 2000 Unicode nativ. R-Pakete verwechseln zwar Unicode- und ANSI-Code, hängen dann aber von der Änderung der Lokalisierungseinstellungen ab, um mit einem Codierungsproblem umzugehen. Was hast du eigentlich versucht? Verschiedene Pakete haben unterschiedliche Macken. Einige von ihnen verwechseln leider Sprache und Kodierung –

+0

Was sind die Kodierung und der Inhalt der * Datei *? Verwendet es eine der Unicode-Kodierungen? Dann könnte es "foošbar" ohne Konvertierungsprobleme enthalten. Sind Sie sicher, dass das Problem nicht die Schriftart von RStudio oder RRO ist? –

+0

Mein Problem ist, dass ich nicht zu einem UTF-8-freundlichen Gebietsschema unter Windows wechseln kann; Dinge wie 'Sys.setlocale (" LC_ALL "," en_US.UTF-8 ")' funktionieren nicht, weiß nicht warum. Also ich habe dieses Problem was auch immer die Datei kodiert. – user43018

Antwort

2

Vielleicht:

library(stringi) 
library(magrittr) 

"foo<U+0161>bar and cra<U+017E>y" %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]+)>", "\\\\u$1") %>% 
    stri_unescape_unicode() %>% 
    stri_enc_toutf8() 
## [1] "foošbar and cražy" 

arbeiten kann (ich brauche nicht die letzte Umwandlung auf macOS Sie können jedoch auf Windows).

+0

Keine Konvertierung erforderlich, Windows verwendet nativ Unicode. R-Pakete verwechseln hingegen viel Unicode- und ANSI-Code. Um die Sache noch schlimmer zu machen, erkennen viele R-Pakete keine Kodierungen, sondern versuchen, aus dem Gebietsschema oder der Sprache des Systems zu erraten. Das macht es interessant, wenn Sie versuchen, mehrere Unicode-Kodierungen oder sogar mehrere Datums- und Zahlenformate zu lesen –

0

Die vorherige Antwort sollte funktionieren, wenn der Codepunkt mit genau vier Ziffern dargestellt wird. Hier ist eine modifizierte Version, die für eine beliebige Anzahl von Ziffern zwischen 1 und 8 funktionieren sollte.

library(stringi) 
library(magrittr) 

"foo<U+0161>bar and cra<U+017E>y, Phoenician letter alf <U+10900>" %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{4})>", "\\\\u$1") %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{5})>", "\\\\U000$1") %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{6})>", "\\\\U00$1") %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{7})>", "\\\\U0$1") %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{8})>", "\\\\U$1") %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{1})>", "\\\\u000$1") %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{2})>", "\\\\u00$1") %>% 
    stri_replace_all_regex("<U\\+([[:alnum:]]{3})>", "\\\\u0$1") %>% 
    stri_unescape_unicode() %>% 
    stri_enc_toutf8() 
## [1] "foošbar and cražy, Phoenician letter alf "