加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 如何在解析后保留多字节字符()

发布时间:2020-12-14 04:25:07 所属栏目:Windows 来源:网络整理
导读:当我在 Windows下使用非本机字符解析R代码时,这些字符似乎变成了它们的Unicode表示形式,例如 Encoding('?')# [1] "UTF-8"parse(text="'?'")# expression('U+011F')parse(text="'?'",encoding='UTF-8')# expression('U+011F')deparse(parse(text="'?'")[1])#
当我在 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('你好')

我的问题是,我如何在这个例子中保留字母?等字符?或者至少在我解析表达式之后如何“重建”原始字符?

我的会话信息:

> 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
问题的根源是(引用 R Installation and administration manual):“R支持底层操作系统可以处理的所有字符集.这些字符集根据当前语言环境进行解释”.不幸的是Windows has no locale supporting UTF-8.

现在,好的是Rgui apparently supports UTF-8(向下滚动到2.7.0>国际化).但是,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] "?"

希望这可以帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读