คำถามนี้เกี่ยวข้องกับหนึ่งก่อนหน้านี้เกี่ยวกับวิธีแทนที่ สตริงที่เน้นเสียง เช่น 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
เพื่อกลับไปใช้แป้นพิมพ์ภาษาอังกฤษ