Bagaimana cara menentukan pengkodean aksen?

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.


person Community    schedule 14.07.2011    source sumber


Jawaban (3)


Lihatlah apa pengkodean temp$dest_nom_ent dan "México", menggunakan Encoding(x). Anda mungkin perlu mengonversi dengan enc2native atau enc2utf8.

person Richie Cotton    schedule 14.07.2011

Coba atur pengkodean string ke salah satu dari "ISO_8859-1" "ISO_8859-15".

Dua saran lagi..., lalu saya menyerah: "UTF-16" "UTF-16LE" . Yang kedua adalah UTF little-endian Saya percaya dan telah membaca bahwa itulah yang sebenarnya digunakan oleh Windows 7. Sebaiknya coba "UTF-16BE" juga. (Materi dikumpulkan dari postingan stackexchange lainnya; https://superuser.com/questions/221593/windows-7-utf-8-and-unicode )

person IRTFM    schedule 14.07.2011
comment
idem untuk dua saran lainnya - person Fred; 15.07.2011

Ya, saya tidak dapat menentukan pengkodean aksen tetapi yang berikut ini memenuhi apa yang saya inginkan. Caranya adalah mengonversi ke UTF-8, atur opsi sub() useBytes=TRUE dan saran untuk menggunakan sanitize.text.function=function(x){x} untuk xtable(). Berikut adalah contoh kodenya. Mudah untuk mengulang semua vokal beraksen:

> temp1 <- unique(temp$dest_nom_ent)
> temp1
 [1] "Aguascalientes"                  "Baja California"                
 [3] "Baja California Sur"             "Campeche"                       
 [5] "Coahuila de Zaragoza"            "Colima"                         
 [7] "Chiapas"                         "Guanajuato"                     
 [9] "Guerrero"                        "Hidalgo"                        
[11] "Jalisco"                         "México"                         
[13] "Michoacán de Ocampo"             "Morelos"                        
[15] "Nayarit"                         "Oaxaca"                         
[17] "Puebla"                          "Querétaro"                      
[19] "Quintana Roo"                    "San Luis Potosí"                
[21] "Sinaloa"                         "Tabasco"                        
[23] "Tlaxcala"                        "Veracruz de Ignacio de la Llave"
[25] "Zacatecas"                      
> temp1 <- iconv(unique(temp1),"","UTF-8")
> temp1
 [1] "Aguascalientes"                  "Baja California"                
 [3] "Baja California Sur"             "Campeche"                       
 [5] "Coahuila de Zaragoza"            "Colima"                         
 [7] "Chiapas"                         "Guanajuato"                     
 [9] "Guerrero"                        "Hidalgo"                        
[11] "Jalisco"                         "México"                         
[13] "Michoacán de Ocampo"             "Morelos"                        
[15] "Nayarit"                         "Oaxaca"                         
[17] "Puebla"                          "Querétaro"                      
[19] "Quintana Roo"                    "San Luis Potosí"                
[21] "Sinaloa"                         "Tabasco"                        
[23] "Tlaxcala"                        "Veracruz de Ignacio de la Llave"
[25] "Zacatecas"                      
> Encoding(temp1)
 [1] "unknown" "unknown" "unknown" "unknown" "unknown" "unknown" "unknown"
 [8] "unknown" "unknown" "unknown" "unknown" "UTF-8"   "UTF-8"   "unknown"
[15] "unknown" "unknown" "unknown" "UTF-8"   "unknown" "UTF-8"   "unknown"
[22] "unknown" "unknown" "unknown" "unknown"
> temp2 <- sub("é", "\\\\'{e}", temp1, useBytes = TRUE)
> temp2 <- data.frame(temp2)
> print(xtable(temp2),sanitize.text.function=function(x){x})
% latex table generated in R 2.13.1 by xtable 1.5-6 package
% Fri Jul 15 13:52:44 2011
\begin{table}[ht]
\begin{center}
\begin{tabular}{rl}
  \hline
 & temp2 \\ 
  \hline
1 & Aguascalientes \\ 
  2 & Baja California \\ 
  3 & Baja California Sur \\ 
  4 & Campeche \\ 
  5 & Coahuila de Zaragoza \\ 
  6 & Colima \\ 
  7 & Chiapas \\ 
  8 & Guanajuato \\ 
  9 & Guerrero \\ 
  10 & Hidalgo \\ 
  11 & Jalisco \\ 
  12 & M\'{e}xico \\ 
  13 & Michoacán de Ocampo \\ 
  14 & Morelos \\ 
  15 & Nayarit \\ 
  16 & Oaxaca \\ 
  17 & Puebla \\ 
  18 & Quer\'{e}taro \\ 
  19 & Quintana Roo \\ 
  20 & San Luis Potosí \\ 
  21 & Sinaloa \\ 
  22 & Tabasco \\ 
  23 & Tlaxcala \\ 
  24 & Veracruz de Ignacio de la Llave \\ 
  25 & Zacatecas \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

Seperti yang sebenarnya diterapkan dalam satu lingkaran:

temp$dest_nom_ent <- iconv(
        temp$dest_nom_ent,"","UTF-8")
temp$dest_nom_mun <- iconv(
        temp$dest_nom_mun,"","UTF-8")
accents <-c("á","é","í","ó","ú")
latex <-c("\\\\'{a}","\\\\'{e}","\\\\'{i}","\\\\'{o}","\\\\'{u}")
for(i in 1:5){
    temp$dest_nom_ent<-sub(accents[i], latex[i], 
            temp$dest_nom_ent, useBytes = TRUE)
    temp$dest_nom_mun<-sub(accents[i], latex[i], 
            temp$dest_nom_ent, useBytes = TRUE)
}
capture.output(
        print(xtable(temp),sanitize.text.function=function(x){x}),
        file = "../paper/rTables.tex", append = FALSE)

Namun, jawabannya tidak lengkap karena saya tidak dapat menjelaskan apa sebenarnya yang terjadi. Menemukannya melalui trial and error.

person Community    schedule 15.07.2011