O gsub no R com substituição unicode fornece resultados diferentes no Windows em comparação com o Unix?
A execução dos seguintes comandos no R no Mac ou Linux produz o resultado esperado, que é a letra grega beta:
gsub("<U\\+[0-9A-F]{4}>", "\u03B2", "<U+03B2>")
"\u03B2"
No entanto, executar o primeiro comando no Windows produz o resultado errado, mas o segundo fornece a saída beta correta. Eu tentei três versões do R no Windows (3.0.2, 3.1.1 e 3.1.2). Todos eles imprimiram consistentemente o resultado "errado". (Não é possível postar a saída, pois não tenho acesso ao Windows agora.)
Além disso, é possível converter unicodes do formato <U + FFFF> (ignore o espaço, pois sem ele o site não exibe nada) para "\ uFFFF" usando o gsub?
Muito obrigado.
ATUALIZAR:
Roubando a solução de MrFlick, cortei a seguinte solução feia no caso de haver vários Unicodes em uma frase. No entanto, a correção é realmente feia, portanto, fique à vontade para postar melhorias.
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)
Resultados:
"This is a <U+03B1> <U+03B2> <U+03B2> <U+03B3> test <U+03B4> string."
"This is a α β β γ test δ string."