在Mac或Linux下在R中运行以下命令会产生预期结果,即希腊字母beta:
然而,在Windows下运行第一个命令会产生错误结果,但第二个命令会给出正确的beta输出。我在Windows上尝试了3个版本的R(3.0.2、3.1.1和3.1.2)。它们都一致地打印出“错误”的结果。(由于我现在无法访问Windows,所以无法发布输出。)
此外,是否可以使用gsub将格式为<U+FFFF>(忽略空格,因为没有它网站不显示任何内容)的Unicode转换为"\uFFFF"?
非常感谢。
更新:
借鉴MrFlick的解决方案,我对以下丑陋的解决方案进行了修改,以防止句子中有多个Unicode。然而,修复方法真的很丑陋,所以请随意发布改进意见。
gsub("<U\\+[0-9A-F]{4}>", "\u03B2", "<U+03B2>")
"\u03B2"
然而,在Windows下运行第一个命令会产生错误结果,但第二个命令会给出正确的beta输出。我在Windows上尝试了3个版本的R(3.0.2、3.1.1和3.1.2)。它们都一致地打印出“错误”的结果。(由于我现在无法访问Windows,所以无法发布输出。)
此外,是否可以使用gsub将格式为<U+FFFF>(忽略空格,因为没有它网站不显示任何内容)的Unicode转换为"\uFFFF"?
非常感谢。
更新:
借鉴MrFlick的解决方案,我对以下丑陋的解决方案进行了修改,以防止句子中有多个Unicode。然而,修复方法真的很丑陋,所以请随意发布改进意见。
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)
结果:
"This is a <U+03B1> <U+03B2> <U+03B2> <U+03B3> test <U+03B4> string."
"This is a α β β γ test δ string."
char *
并调用 ANSI API 方法而不是wchar *
或char16_t *
(作弊,这是 C++11 类型)。在此问题上,R 是不一致的,有些软件包使用宽字符串,有些使用窄字符串,具体取决于系统的locale 是否为 UTF8。有些可以处理 Unicode 文本而不会出现问题,而其他则会损坏它。 - Panagiotis Kanavos