Pertanyaan ini terkait dengan satu sebelumnya tentang cara mengganti string beraksen seperti México
dengan kode Latex
yang setara M\'{e}xico
.
Masalah saya di sini sedikit berbeda. Saya menggunakan database pihak ketiga dengan variabel string dengan aksen Spanyol seperti di atas. Namun, pengkodeannya tampak aneh karena ini adalah perilaku yang saya dapatkan:
> grep("México",temp$dest_nom_ent)
integer(0)
> grep("Mexico",temp$dest_nom_ent)
integer(0)
> grep("xico",temp$dest_nom_ent)
[1] 18 19 20
> temp$dest_nom_ent[grep("xico",temp$dest_nom_ent)]
[2] "México" "México" "México"
dimana temp$dest_nom_ent
adalah variabel dengan nama negara bagian México.
Pertanyaan saya, kemudian, adalah bagaimana mengubah variabel string dari database pihak ketiga menjadi pengkodean yang akan dikenali oleh fungsi R
standar. Tolong dicatat:
> Encoding(temp$dest_nom_ent)
[1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
[8] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
[15] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
[22] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
[29] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
[36] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
[43] "unknown" "unknown"
Untuk info lebih lanjut saya menggunakan Windows 7 64. Catatan juga:
> charToRaw(temp$dest_nom_ent[18])
[1] 4d e9 78 69 63 6f
Manakah dari sumber ini yang sesuai dengan Windows Spanyol (Tradisional Urutkan) lokal.
M=4d
é=e9
x=78
i=69
c=63
o=6f
Dan juga perhatikan:
> charToRaw("México")
[1] 4d c3 a9 78 69 63 6f
> Encoding("México")
[1] "latin1"
Saya telah mencoba yang berikut ini namun tidak berhasil (mis. Artinya grep("é",temp$dest_nom_ent)
mengembalikan vektor nol):
Encoding(temp$dest_nom_ent)<-"latin1"
temp$dest_nom_ent <- iconv(temp$dest_nom_ent,"","latin1")
temp$dest_nom_ent <- enc2utf8(temp$dest_nom_ent)
...
Saya memeriksa rangkaian karakter yang didukung menggunakan iconvlist()
dan "WINDOWS-1252"
didukung. Namun hal berikut ini tidak berhasil:
> temp1 <- temp$dest_nom_ent[grep("xico",temp$dest_nom_ent)]
> temp1
[1] "México" "México" "México"
> Encoding(temp1)<-"WINDOWS-1252"
> temp1 <- iconv(temp1,"WINDOWS-1252","latin1")
> temp1
[1] "México" "México" "México"
> Encoding(temp1)
[1] "latin1" "latin1" "latin1"
> charToRaw(temp1[1])
[1] 4d e9 78 69 63 6f
> grep("é",temp1)
integer(0)
yang dibandingkan dengan:
> temp2 <- c("México","México","México")
> temp2
[1] "México" "México" "México"
> Encoding(temp2)
[1] "latin1" "latin1" "latin1"
> charToRaw(temp2[1])
[1] 4d c3 a9 78 69 63 6f
> grep("é",temp2)
[1] 1 2 3)
Mencoba mencari tahu pengkodean dengan kekerasan seperti:
try(for(i in 1:length(iconvlist())){
temp1 <- temp$dest_nom_ent[grep("xico",temp$dest_nom_ent)]
Encoding(temp1)<-iconvlist()[i]
temp1 <- iconv(temp1,iconvlist()[i],"latin1")
print(grep("é",temp1))
print(i)
},silent=FALSE)
Saya tidak terbiasa dengan fungsi try
tetapi masih ada kesalahan alih-alih mengabaikannya sehingga tidak dapat memeriksa seluruh daftar:
...
[1] 17
integer(0)
[1] 18
integer(0)
[1] 19
integer(0)
[1] 20
Error in iconv(temp1, iconvlist()[i], "latin1") :
unsupported conversion from 'CP-GR' to 'latin1' in codepage 1252
Akhirnya:
> Sys.getlocale()
[1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
> d<-c("México","México")
> for(i in 1:7){d1 <- str_sub(d[1],i,i); print(d1)}
[1] "M"
[1] "Ã"
[1] "©
[1] "x"
[1] "i"
[1] "c"
[1] "o"
> print(grep("é",d))
[1] 1 2
Jadi sepertinya saya harus mengubah lokal komputer seperti yang disarankan di sini. Lihat juga di sini
PS: Jika Anda bertanya-tanya bagaimana dengan lokal English_United States.1252 saya berhasil mengetik d<-c("México","México")
caranya adalah dengan mengatur keyboard Spanyol sekunder (jenis tradisional) menggunakan Control Panel > Clock, Language and Region > Region and Language > Keyboards and Languages > Change Keyboards
dan di bawah installed services
klik tambahkan dan arahkan ke jenis tradisional Spanyol. Kemudian di bawah advanced key settings
Anda dapat membuat jalan pintas untuk mengganti keyboard. Dalam kasus saya Shit+Alt
. Jadi jika saya ingin mengetik ñ
dalam bahasa lokal default bahasa Inggris, saya melakukan Shift+Alt
diikuti oleh ;
dan kemudian Shift+Alt
untuk kembali ke keyboard bahasa Inggris.