7

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     
4

2 に答える 2

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、同等のUnicodeタグgsubを持つのすべてのインスタンス。"<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>"

もちろん、これは完全な証拠ではありません。

これがとてもハックである必要があるのは本当に残念です。

于 2013-01-17T04:13:14.073 に答える
2

問題の根本は次のとおりです( Rインストールおよび管理マニュアルを引用):「Rは、基盤となるOSが処理できるすべての文字セットをサポートします。これらは現在のロケールに従って解釈されます」。残念ながら、WindowsにはUTF-8をサポートするロケールがありません

さて、良いことは、Rguiが明らかにUTF-8をサポートしていることです(2.7.0までスクロールダウン>国際化)。ただし、Rパーサーは、ロケールでサポートされている文字でのみ機能します。したがって、私にとって有効な解決策は、解析を行うためだけにRロケールを一時的に変更しSys.setlocale()、後で解析を行うとき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] "ğ"

お役に立てれば!

于 2013-01-19T22:55:49.020 に答える