当我在Windows下解析具有非本地字符的R代码时,这些字符似乎变成了它们的Unicode表示,例如。
Encoding('ğ')
# [1] "UTF-8"
parse(text="'ğ'")
# expression('<U+011F>')
parse(text="'ğ'", encoding='UTF-8')
# expression('<U+011F>')
deparse(parse(text="'ğ'")[1])
# [1] "expression(\"<U+011F>\")"
eval(parse(text="'ğ'"))
# [1] "<U+011F>"
由于我的语言环境是简体中文,我可以解析带有中文字符的代码,例如。
parse(text="'你好'")
# expression('你好')
我的问题是,如何在此示例中保留字母ğ
等字符?或者至少如何在deparse()
表达式之后“重建”原始字符?
我的会话信息:
> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=Chinese (Simplified)_People's Republic of China.936
[2] LC_CTYPE=Chinese (Simplified)_People's Republic of China.936
[3] LC_MONETARY=Chinese (Simplified)_People's Republic of China.936
[4] LC_NUMERIC=C
[5] LC_TIME=Chinese (Simplified)_People's Republic of China.936
attached base packages:
[1] stats graphics grDevices utils datasets methods base
答案 0 :(得分:4)
我很高兴看到更简单的表面,但这是一个开始。
eval.utags <- function(x) {
op <- options("useFancyQuotes")
on.exit(options(useFancyQuotes=op))
options(useFancyQuotes=FALSE) # so dQuote/sQuote use ascii quotes
# replace u-tag with u-escape, e.g., <U+12FF> --> \\u12FF
with.uescapes <- gsub('<U\\+([[:xdigit:]]+)>', '\\\\u\\1', x)
# find first quote char ('"' or "'"), if any
# pick appropriate quote fun, dQuote or sQuote
first.quote <- regmatches(with.uescapes, regexpr("\'|\"", with.uescapes))
quote.fun <- if (identical(first.quote, "'")) dQuote else sQuote
# parse/eval quoted characters
eval(parse(text=quote.fun(with.uescapes)))
}
x <- '<U+011f><U+4f60><U+597d>abc'
y <- eval.utags(x)
y
# [1] "ğ你好abc"
Encoding(y)
# "UTF-8"
如果您的原始字符串可能包含要保留的文字unicode标记子字符串,那么在将parse
gsub
的所有实例与同等的unicode标记一起传递给"<U+"
之前, "<U+003c><U+0055><U+002b>"
。
x <- "'Щ<U+1234>'"
y <- eval(parse(text=gsub('<U\\+', '<U+003c><U+0055><U+002b>', x)))
# [1] "<U+0429><U+003c><U+0055><U+002b>1234>"
z <- eval.utags(y)
# [1] "Щ<U+1234>"
但是,这当然不是完整的证明。
这真是一种耻辱,这必须是如此hackish。
答案 1 :(得分:2)
问题的根源是(引用R Installation and administration manual):“R支持底层操作系统可以处理的所有字符集。这些字符集根据当前语言环境进行解释”。不幸的是,Windows has no locale supporting UTF-8。
现在,好的是Rgui apparently supports UTF-8(向下滚动到2.7.0&gt;国际化)。但是,R解析器仅适用于语言环境中支持的字符。因此,对我有用的解决方案是暂时使用Sys.setlocale()
更改R语言环境以进行解析,稍后在使用iconv()
转换为UTF-8时使用
> Sys.getlocale()
[1] "LC_COLLATE=Greek_Greece.1253;LC_CTYPE=Greek_Greece.1253;LC_MONETARY=Greek_Greece.1253;LC_NUMERIC=C;LC_TIME=Greek_Greece.1253"
> orig.locale <- Sys.getlocale("LC_CTYPE")
> parse(text="'你好'")
expression('<U+4F60><U+597D>')
> Sys.setlocale(locale="Chinese")
[1] "LC_COLLATE=Chinese (Simplified)_People's Republic of China.936;LC_CTYPE=Chinese (Simplified)_People's Republic of China.936;LC_MONETARY=Chinese (Simplified)_People's Republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_People's Republic of China.936"
> a <- parse(text="'你好'")
> a
expression('你好')
> Sys.setlocale(locale="Turkish")
[1] "LC_COLLATE=Turkish_Turkey.1254;LC_CTYPE=Turkish_Turkey.1254;LC_MONETARY=Turkish_Turkey.1254;LC_NUMERIC=C;LC_TIME=Turkish_Turkey.1254"
> b <- parse(text="'ğ'")
> b
expression('ğ')
> Sys.setlocale(locale=orig.locale)
[1] "LC_COLLATE=Greek_Greece.1253;LC_CTYPE=Greek_Greece.1253;LC_MONETARY=Greek_Greece.1253;LC_NUMERIC=C;LC_TIME=Greek_Greece.1253"
> a
[1] expression('ΔγΊΓ')
> b
[1] expression('π')
> ai <- iconv(a, from="CP936", to="UTF-8")
> ai
[1] "你好"
> bi <- iconv(b, from="CP1254", to="UTF-8")
> bi
[1] "ğ"
希望这有帮助!