จะตรวจสอบการเข้ารหัสสำเนียงได้อย่างไร?

คำถามนี้เกี่ยวข้องกับหนึ่งก่อนหน้านี้เกี่ยวกับวิธีแทนที่ สตริงที่เน้นเสียง เช่น México โดยมีรหัส Latex เทียบเท่า M\'{e}xico

ปัญหาของฉันที่นี่แตกต่างออกไปเล็กน้อย ฉันใช้ฐานข้อมูลบุคคลที่สามที่มีตัวแปรสตริงพร้อมสำเนียงภาษาสเปนเหมือนด้านบน อย่างไรก็ตาม การเข้ารหัสดูแปลกเนื่องจากนี่คือพฤติกรรมที่ฉันได้รับ:

> 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"

โดยที่ temp$dest_nom_ent เป็นตัวแปรที่มีชื่อสถานะของเม็กซิโก

คำถามของฉันคือวิธีแปลงตัวแปรสตริงจากฐานข้อมูลบุคคลที่สามเป็นการเข้ารหัสที่ฟังก์ชัน R มาตรฐานจะรับรู้ โปรดทราบ:

> 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"

สำหรับข้อมูลเพิ่มเติม ฉันใช้ Windows 7 64 โปรดทราบด้วย:

> charToRaw(temp$dest_nom_ent[18])
[1] 4d e9 78 69 63 6f

ซึ่งจากแหล่งที่มานี้เกิดขึ้นพร้อมกับ Windows Spanish (Traditional เรียงลำดับ) สถานที่

M=4d
é=e9
x=78
i=69
c=63
o=6f

และโปรดทราบว่า:

> charToRaw("México")
[1] 4d c3 a9 78 69 63 6f
> Encoding("México")
[1] "latin1"

ฉันลองทำสิ่งต่อไปนี้ไม่สำเร็จ (เช่นความหมาย grep("é",temp$dest_nom_ent) ส่งคืนเวกเตอร์ null):

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)
...

ฉันตรวจสอบชุดอักขระที่รองรับโดยใช้ iconvlist() และ "WINDOWS-1252" แล้ว อย่างไรก็ตาม สิ่งต่อไปนี้ไม่ได้ผล:

> 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)

ซึ่งเปรียบเทียบกับ:

> 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)

พยายามค้นหาการเข้ารหัสด้วยกำลังเดรัจฉานเช่น:

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)

ฉันไม่คุ้นเคยกับฟังก์ชัน try แต่ยังคงมีข้อผิดพลาดแทนที่จะเพิกเฉย ดังนั้นจึงไม่สามารถตรวจสอบรายการทั้งหมดได้:

...
[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

ในที่สุด:

> 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

ดูเหมือนว่าฉันจะต้องเปลี่ยนภาษาของคอมพิวเตอร์ตามที่แนะนำ ที่นี่ ดูที่นี่ด้วย

PS: ในกรณีที่คุณสงสัยว่าสถานที่ English_United States.1252 ฉันสามารถพิมพ์ d<-c("México","México") ได้อย่างไร โดยการตั้งค่าแป้นพิมพ์ภาษาสเปนรอง (การเรียงลำดับแบบดั้งเดิม) โดยใช้ Control Panel > Clock, Language and Region > Region and Language > Keyboards and Languages > Change Keyboards และต่ำกว่า installed services คลิกเพิ่มและนำทางไปยังการเรียงลำดับภาษาสเปนแบบดั้งเดิม จากนั้นภายใต้ advanced key settings คุณสามารถสร้างทางลัดเพื่อสลับคีย์บอร์ดได้ ในกรณีของฉัน Shit+Alt ดังนั้นหากฉันต้องการพิมพ์ ñ ในภาษาเริ่มต้นของภาษาอังกฤษ ฉันจะพิมพ์ Shift+Alt ตามด้วย ; และ Shift+Alt เพื่อกลับไปใช้แป้นพิมพ์ภาษาอังกฤษ


person Community    schedule 14.07.2011    source แหล่งที่มา


คำตอบ (3)


ดูว่าการเข้ารหัสของ temp$dest_nom_ent และ "México" คืออะไร โดยใช้ Encoding(x) คุณอาจต้องแปลงด้วย enc2native หรือ enc2utf8

person Richie Cotton    schedule 14.07.2011

ลองตั้งค่าการเข้ารหัสสตริงเป็น "ISO_8859-1" "ISO_8859-15" อย่างใดอย่างหนึ่ง

อีกสองข้อเสนอแนะ... ผมก็ยอมแพ้: "UTF-16" "UTF-16LE" อย่างที่สองคือ UTF little-endian ฉันเชื่อและได้อ่านมาแล้วว่ามันเป็นสิ่งที่ Windows 7 ใช้จริง อาจลองใช้ "UTF-16BE" ด้วยเช่นกัน (เนื้อหาที่รวบรวมจากการโพสต์ stackexchange อื่น https://superuser.com/questions/221593/windows-7-utf-8-and-unicode )

person IRTFM    schedule 14.07.2011
comment
ขอคำแนะนำอีกสองข้อครับ - person Fred; 15.07.2011

ฉันไม่สามารถระบุการเข้ารหัสสำเนียงได้ แต่สิ่งต่อไปนี้ทำให้สิ่งที่ฉันต้องการสำเร็จ เคล็ดลับคือการแปลงเป็น UTF-8 ตั้งค่า sub() ตัวเลือก useBytes=TRUE และ คำแนะนำเพื่อใช้ sanitize.text.function=function(x){x} สำหรับ xtable() นี่คือโค้ดตัวอย่าง ง่ายต่อการวนซ้ำสระเน้นเสียงทั้งหมด:

> 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}

ตามการใช้งานจริงในวง:

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)

ถึงกระนั้น คำตอบก็ยังไม่สมบูรณ์เพราะฉันไม่สามารถอธิบายได้ว่าเกิดอะไรขึ้นกันแน่ พบผ่านการลองผิดลองถูก

person Community    schedule 15.07.2011