gsub in R mit Unicode-Ersetzung liefert unter Windows andere Ergebnisse als Unix?

Wenn Sie die folgenden Befehle in R unter Mac oder Linux ausführen, erhalten Sie das erwartete Ergebnis, also den griechischen Buchstaben Beta:

gsub("<U\\+[0-9A-F]{4}>", "\u03B2", "<U+03B2>")

"\u03B2"

Wenn Sie jedoch den ersten Befehl unter Windows ausführen, wird das falsche Ergebnis erzielt, während der zweite Befehl die richtige Beta-Ausgabe liefert. Ich habe 3 Versionen von R unter Windows (3.0.2, 3.1.1 und 3.1.2) ausprobiert. Sie alle druckten durchweg das "falsche" Ergebnis. (Die Ausgabe kann nicht gepostet werden, da ich jetzt keinen Zugriff auf Windows habe.)

Ist es außerdem möglich, Unicodes vom Format <U + FFFF> (ignorieren Sie das Leerzeichen, da die Website sonst nichts anzeigt) mit gsub? @ In "\ uFFFF" umzuwandel

Vielen Dank

AKTUALISIERE:

Die Lösung von MrFlick gestohlen, habe ich die folgende hässliche Lösung gehackt, falls ein Satz mehrere Unicodes enthält. Das Update ist jedoch wirklich hässlich. Sie können also jederzeit Verbesserungen vornehmen.

test.string <- "This is a <U+03B1> <U+03B2> <U+03B2> <U+03B3> test <U+03B4> string."

trueunicode.hack <- function(string){
    m <- gregexpr("<U\\+[0-9A-F]{4}>", string)
    if(-1==m[[1]][1])
        return(string)

    codes <- unlist(regmatches(string, m))
    replacements <- codes
    N <- length(codes)
    for(i in 1:N){
        replacements[i] <- intToUtf8(strtoi(paste0("0x", substring(codes[i], 4, 7))))
    }

    # if the string doesn't start with a unicode, the copy its initial part
    # until first occurrence of unicode
    if(1!=m[[1]][1]){
        y <- substring(string, 1, m[[1]][1]-1)
        y <- paste0(y, replacements[1])
    }else{
        y <- replacements[1]
    }

    # if more than 1 unicodes in the string
    if(1<N){
        for(i in 2:N){
            s <- gsub("<U\\+[0-9A-F]{4}>", replacements[i], 
                      substring(string, m[[1]][i-1]+8, m[[1]][i]+7))
            Encoding(s) <- "UTF-8"
            y <- paste0(y, s)
        }
    }

    # get the trailing contents, if any
    if( nchar(string)>(m[[1]][N]+8) )
        y <- paste0( y, substring(string, m[[1]][N]+8, nchar(string)) )
    y
}

test.string
trueunicode.hack(test.string)

Ergebnisse

"This is a <U+03B1> <U+03B2> <U+03B2> <U+03B3> test <U+03B4> string."
"This is a α β β γ test δ string."

Antworten auf die Frage(4)

Ihre Antwort auf die Frage