2016-09-16 12 views
1

"¥u0531"のようなUTF-8文字列をRで作成することはできますが、コード "0531"を変数として使用できますか?UTF-8:文字コード(文字コード)で文字(文字列)を作成

私は良い文字列(適切なUTF-8文字列)に動的に変換したい( "UTF-8コードのタグ"からなる)不正な文字列があります。

badString <- "<U+0531><U+0067>" 
goodString <- "Աg" # how can I generate that by a function? 

turnBadStringToGoodString<- function (myString){ 
    newString <- gsub("<U\\+([0-9]{4})>","\\u\\1",myString) 
    newString2 <- parse(text = paste0("'", newString, "'"))[[1]] 
    return (
    newString2 
    ) 
} 

turnBadStringToGoodString (badString) 
# returns an expression. What to do next? 

望ましい結果を手動で

"\u0531\u0067" 

を入力することによって達成することができますしかし、どのようにそれが機能して行うことができますか?というPlaseノートアイデアをありがとう。

また、関連

Converting a \u escaped Unicode string to ASCII

答えて

1

私は数字をキャプチャし、唯一の変換されたUnicodeのシンボルを返す正規表現でgsubfnを使用することをお勧め:

library(gsubfn) 
badString <- "<U+0531><U+0067>" 
turnBadStringToGoodString<- function (myString){ 
    return (
    gsubfn("<U\\+(\\d{4})>", ~ parse(text = paste0("'", paste0("\\u",x), "'"))[[1]],myString) 
    ) 
} 
turnBadStringToGoodString(badString) 
[1] "Աg" 

説明のビットを:

  • <U\\+(\\d{4})>は、<,U,+と一致し、次にグループ1 4桁で一致するだけです>
  • グループ1の値はコールバック関数(~で、これは内部にxと呼ばれます)に渡され、コールバック内で変換が実行されます。
  • gsubfnは、入力文字列内のすべての重複しない一致を処理します。
+0

一見よく見えます。それを実装し、期待どおりに動作するかどうかを確認します。 :) – nilsole

+1

私のRStudioには正しい方法で 'badString'を' View() 'するのに問題がありました。 'read.csv()'で正しい出力を得るために 'Sys.setlocale(locale =" Russian ")'を設定しなければなりませんでした。 http:// stackoverflow.com/a/34256414/2381339' – nilsole

関連する問題