作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我在 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()
表达式之后如何“重建”原始字符?
我的 session 信息:
> 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
最佳答案
我很高兴看到更简单的表面,但这是一个开始。
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
"<U+"
的所有实例使用等效的 unicode 标签,"<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>"
当然,这还不是完整的证据。
真是太遗憾了,这不得不如此骇人听闻。
关于windows - 如何在 parse() 之后保留多字节字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14369628/
我是一名优秀的程序员,十分优秀!