0

実質的に同等の文字列が 2 つあります。彼らは同じように見えます。

str1<-"Diş Hekimliği Fakültesi"
str2<-"Diş Hekimliği Fakültesi"

しかし、nchar()それらを試してみると、それぞれ 26 文字と 23 文字が返されます。そして、私が使用するときstrsplit();

strsplit(str1,split="")
[[1]]
 [1] "D" "i" "s" "̧"   " " "H" "e" "k" "i" "m" "l" "i" "g" "̆"   "i" " " "F" "a" "k" "u" "̈"   "l" "t" "e" "s" "i"

strsplit(str2,split="")
[[1]]
 [1] "D" "i" "ş" " " "H" "e" "k" "i" "m" "l" "i" "ğ" "i" " " "F" "a" "k" "ü" "l" "t" "e" "s" "i"

各言語固有の特殊文字は 2 文字としてカウントされます。str1 を str2 にするにはどうすればよいですか? 私の唯一の手動ソリューションは、を使用することgsub()でした。

ps。残念ながら、この例をここに完全に持ち込むことはできません。コードをコピーして貼り付けようとすると、両方とも 23 文字になります。ここにコピペで何か。

4

1 に答える 1

0

このiconv関数は、国際エンコーディング間の音訳を管理するシステム固有の関数です。iconvlistOS 機能が使用する名前のベクトルを返すことができる関数があります。str1 (23 文字) を 26 に、またはその逆に変換できるかどうかを確認するために、自分のシステムで 419 のそのようなエンコーディングをすべて実行し、自分のマシンで 2 つのそのようなエンコーディングを見つけましsapplyた。try私は Mac を使用しているため、OS の状態を開示していないため、これらの特定の値が機能することを保証することはできません。

上記のstrsplit-result からの出力だけで MWE をまとめることができました。str2

str1<-"Diş Hekimliği Fakültesi"
str3 <- scan(what="")
 "D" "i" "s" "̧"   " " "H" "e" "k" "i" "m" "l" "i" "g" "̆"   "i" " " "F" "a" "k" "u" "̈"   "l" "t" "e" "s" "i"
#27: 
#Read 26 items
> str3c <- paste0(str3, collapse="")
> nchar(str3c)
[1] 26
> str1
[1] "Diş Hekimliği Fakültesi"

多くのエラー メッセージ (囲まれているために実行が停止しない) の後try()、次のコードを使用して 2 つのエンコーディングのリストを取得しました。

?iconv
which(sapply( try(utils::head(iconvlist(), n = 419)), function(xc) 
                                                  try(nchar(iconv(str1, to=xc))))==26)
#--------snipped large number of error messages-------
Error in nchar(iconv(str1, to = xc)) : invalid multibyte string 1
UTF-8-MAC  UTF8-MAC 
      400       402 

次に、逆が成功する可能性があると考えて (str1 が 23 文字のオブジェクトとして開始されたため)、次のことを試してみました。

> iconv(str3c,from="UTF-8-MAC", to="UTF-8")
[1] "Diş Hekimliği Fakültesi"
> nchar(iconv(str3c,from="UTF-8-MAC", to="UTF-8"))
[1] 23

Windows iconv の Web ページを見ると、 のリストがあることがわかり {10081, "x-mac-turkish"}, /* Turkish (Mac) */ます。Windoze を使用している場合は、おそらく試してみることができます。

================

以下の以前の調査(文字値を引き離す方法を知っておくと便利だと思います。)

わかった。上記のものだけでMWEを実際にまとめることができます:

str1<-"Diş Hekimliği Fakültesi"
str3 <- scan(what="")
#1: "D" "i" "s" "̧"   " " "H" "e" "k" "i" "m" "l" "i" "g" "̆"   "i" " " "F" "a" "k" "u" "̈"   "l" "t" "e" "s" "i"
#27: 
#Read 26 items
> str3c <- paste0(str3, collapse="")
> nchar(str3c)
[1] 26
> str1
[1] "Diş Hekimliği Fakültesi"

次に、キャラクターのハッキングを行います。

> ?charToRaw
> charToRaw(str3c)
 [1] 44 69 73 cc a7 20 48 65 6b 69 6d 6c 69 67 cc 86 69 20 46 61 6b 75 cc 88 6c 74 65
[28] 73 69
> charToRaw(str1)
 [1] 44 69 c5 9f 20 48 65 6b 69 6d 6c 69 c4 9f 69 20 46 61 6b c3 bc 6c 74 65 73 69

3 番目の文字を表す 3 つの Raw アイテムを見てください。2 番目の表現では、16 進数の「cc」でバックスペースしてからディセンダーを出力する基本文字が使用されているようです。正規表現でそれらを認識できるかどうかを確認します。

 rawToChar( charToRaw(str3c) [3])
#[1] "s"
 rawToChar( charToRaw(str3c) [4])
#[1] "\xcc"
 rawToChar( charToRaw(str3c) [5])
#[1] "\xa7"
 grep("s\\xcc\\xa7", str3c)
#[1] 1   # Success!

そして、これらの単語の分割バージョンで作業していた場合に最終的に得られたものよりもおそらく効率的だと思う gsub があります。

gsub("s\\xcc\\xa7", "\\c5\\9f", str3c)
#[1] "Diş Hekimliği Fakültesi"

また、R が 26 の「文字」があることを示していたエントリには、実際には 29 の生のエントリがあったことに注意してください (23 とされていたエントリには 26 が含まれていました)。cc3 つ(バックスペース) は実際にはカウントされていなかったと思います。

于 2015-04-04T18:49:05.190 に答える