Vim แสดงอักขระแปลก ๆ <91>, <92>


26

ในขณะที่ใช้ Vim บน SSH ฉันคัดลอกเนื้อหาบางส่วนจากหน้าเว็บไปยังเซสชัน SSH / Vim ของฉันและได้ผลลัพธ์ดังนี้:

SIZE=`df -h|grep $DISC|awk <91>{print $2}<92>`

เห็นได้ชัด<91>และ<92>ยืนหยัดอยู่ได้'แต่ฉันจะค้นหาและแทนที่สิ่งนี้ได้อย่างไร และสิ่งที่ไม่ว่า91/ 92หมายความว่าอย่างไร สิ่งนี้ถูกเข้ารหัสเพราะ91/ 92ใน ASCII หมายถึง\และ[อย่างไร

คำตอบ:


23

เนื้อหาในหน้าเว็บต้นฉบับของคุณได้รับการจัดรูปแบบใหม่อย่างมาก ข้อความควรใช้อย่างไม่ต้องสงสัย (เครื่องหมายตรง) อัญประกาศเดียว (ASCII 39/0x27, U+0027) แทนที่จะเป็นเครื่องหมายอัญประกาศเดี่ยว ( U+2018และU+2019ซึ่งอยู่0x91 and 0x92ใน CP1252 (หรือที่รู้จักในชื่อ MS-ANSI และ WINDOWS-1252 การเข้ารหัส 8 บิตทั่วไปบน Windows)) .

Vim แสดงรหัสฐานสิบหกให้คุณเพราะรหัสเหล่านั้นไม่ถูกต้องในการเข้ารหัสใด ๆ ที่ Vim ใช้ (อาจเป็น UTF-8) หากคุณกำลังแก้ไขข้อความที่ถูกบันทึกไว้ในไฟล์คุณสามารถโหลดไฟล์ใหม่เป็น CP1252 ด้วย:e ++enc=cp1252; สิ่งนี้จะทำให้คำพูดหยิก แต่ไม่มีเหตุผลที่แท้จริงในการโหลดใหม่เป็น CP1252 เพียงแค่ลบ0x91และ0x92ตัวอักษรและแทนที่ด้วยคำพูดเดียว


คุณมักจะได้รับอัญประกาศโค้ง / apostrophe จากเนื้อหาที่คัดลอกมาจาก MS Word ซึ่งอัตโนมัติแทรกอัญประกาศหยิก / apostrophe เป็นส่วนหนึ่งของคุณสมบัติ "คำคมสมาร์ท" หากแบบอักษรของคุณไม่รองรับอักขระเหล่านั้นคุณจะได้รับพื้นที่ว่างแทนตัวอักษร
lambacck

1
+1 สำหรับ:e ++enc=cp1252
wfaulk

@ChrisJohnsen มีวิธีโทร vi ด้วยธงที่ทำสิ่งเดียวกัน:e ++enc=cp1252หรือไม่? ถ้าฉันต้องการ vi จากบรรทัดคำสั่งไฟล์ที่มีอักขระ MS word มันจะดีที่สามารถทำได้ในขั้นตอนเดียวแทนที่จะเปิด vi แล้วโหลดไฟล์ด้วย:eคำสั่ง
Leo Simon

@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- คำสั่งรันก่อนหน้าปกติ.vimrcและตั้งค่าfileencodingsตัวเลือก (สังเกตตอนจบsคุณยังสามารถใช้ชื่อที่สั้นกว่าfencs) เพื่อให้ Vim จะลองใช้ CP1252 เมื่อโหลดไฟล์เท่านั้น การดำเนินการนี้ควรใช้สำหรับการแก้ไขไฟล์ดังกล่าวแบบครั้งเดียว แต่อาจทำให้เกิดปัญหาถ้าคุณต้องการใช้อินสแตนซ์ของ Vim นั้นเพื่อแก้ไขไฟล์ด้วยการเข้ารหัสอื่น ๆ
Chris Johnsen

ขอบคุณ! เพื่อให้ชัดเจนตอนนี้ฉันกำลังใช้vim -c"set fencs" /path/to/file
Leo Simon

27

91 และ 92 เป็นรหัสเลขฐานสิบสำหรับเครื่องหมาย apostrophe แบบเปิดและปิด (เครื่องหมายคำพูดเดี่ยว) ในการเข้ารหัส latin1 / ISO-8859-1 รุ่นเริ่มต้นของ MS Windows ซึ่งเรียกว่าcp1252 / Windows-1252โดยเฉพาะเจาะจงมากขึ้น(โดยที่ cp ย่อมาจากรหัส หน้า).

อักขระเหล่านี้มักถูกแทรกโดยคนที่คัดลอกเนื้อหาจากเอกสาร Word / อีเมล Outlook ซึ่งเป็นส่วนหนึ่งของคุณสมบัติ "การเสนอราคาอัจฉริยะ" อักขระปัญหาอื่น ๆ ในหน้ารหัสนี้เป็นเลขฐานสิบหก 93/94 ซึ่งเป็นเครื่องหมายคำพูดเปิดและปิดคู่สัญลักษณ์แสดงหัวข้อย่อย (•) และ OE ligature (œและŒ) คุณสามารถดูรายการทั้งหมดของ "ตัวอักษรปัญหา" ตัวที่ไม่แมปโดยตรงใน ISO-8859-1 หรือ UTF-8 ด้วยรหัสเดียวกันบนหน้า Wikipeda สำหรับ cp1252เน้นด้วยสีเขียว

หากสิ่งที่คุณต้องการคือการเปิดไฟล์ในการเข้ารหัสที่ถูกต้องแล้วใช้ตัวเลือก ++ enc = cp1252 ไปที่คำสั่ง: e

:e ++enc=1252 filename.txt

คุณสามารถแทนที่รหัสฐานสิบหกที่ไม่ดีใน Vim ด้วยคำสั่ง replace (: s) และหนึ่งในการแทนที่รหัส:

\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

ในการเปลี่ยนอักขระแบบเลขฐานสิบหก 91/92 ในสิ่งที่คุณต้องทำ:

:%s/[\x91\x92]/'/g

จะเป็นการดีถ้ามีคำสั่ง bash เพื่อแทนที่อักขระเหล่านั้นในไฟล์ทั้งหมดในไดเรกทอรี ฉันได้สิ่งนี้จากการค้นหา google อย่างรวดเร็วsed -i "s/[\x91\x92]/\'/g" *.txtแต่มันไม่ได้ผล
Buttle Butkus

ฉันเพิ่งพบสิ่งที่ดูเหมือนจะทำงานกับบรรทัดคำสั่ง สิ่งนี้จะค้นหา / แทนที่สำหรับไฟล์. txt ทั้งหมดในโฟลเดอร์ปัจจุบัน สำรวจ Perl ก่อนที่จะใช้สิ่งนี้เพราะฉันไม่รู้ว่าสวิตช์ทำอะไร perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus

2
sed -i "s/\x92/'/g"ทำงานให้ฉัน
Karoly Horvath

3

ใช้iconvเพื่อแปลงไฟล์ข้อความจาก CP1252 เป็น UTF-8 ก่อนเปิด

iconv -f cp1252 -t utf8 inputfile.csv > outputfile.csv

บน Mac OS ใช้สิ่งนี้:

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv

-3

พวกเขายืนสำหรับเลขฐานสิบหก 91 และ 92 ซึ่งในเพจรหัสของ Windows คือการเปิดและปิดราคาเดียว ('และ' - Alt-0145 และ Alt-0146)

ลองค้นหา / แทนที่ต่อไปนี้:

:s%/\<9[12]\>/'/g

1
ฉันไม่สามารถลงคะแนนได้เนื่องจากขาดคะแนน แต่คำสั่งการแทนที่นี้ผิดฉันไม่รู้ว่าจะเริ่มต้นได้ที่ไหน :(
lambacck

1
วิธีนี้ใช้ไม่ได้สำหรับฉัน: stackoverflow.com/questions/2798398/…ให้โซลูชันที่ใช้งานได้
ความสับสน

@lambacck: ฉันสมมติว่าไฟล์มีสตริงตัวอักษร "91" และ "92" และในกรณีนี้คำสั่งนี้ถูกต้อง หากสิ่งเหล่านี้เป็นอักขระฐานสิบหกแสดงว่าคุณถูกต้องคุณต้องมีคำสั่งทดแทนหรือสิ่งที่คล้ายกัน
Alex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.