Vim hiển thị các ký tự lạ <91>, <92>


26

Trong khi sử dụng Vim qua SSH, tôi đã sao chép một số nội dung từ trang web sang phiên SSH / Vim của mình và nhận được kết quả như sau:

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

Rõ ràng <91>và đại diện <92>cho 'nhưng làm thế nào tôi có thể tìm kiếm và thay thế công cụ này? Và những gì mà 91/ 92nghĩa là gì? Điều này được mã hóa bởi vì 91/ 92trong ASCII có nghĩa là gì \[?

Câu trả lời:


23

Nội dung trên trang web nguồn của bạn đã được định dạng lại quá mức. Văn bản chắc chắn được cho là sử dụng dấu ngoặc đơn (thẳng) (ASCII 39/0x27, U+0027) thay vì dấu ngoặc đơn đơn ( U+2018U+2019, 0x91 and 0x92trong CP1252 (còn được gọi là MS-ANSI và WINDOWS-1252; mã hóa 8 bit phổ biến trên Windows)) .

Vim đang hiển thị cho bạn các mã hex vì chúng không hợp lệ trong bất kỳ mã hóa nào mà Vim đang sử dụng (có thể là UTF-8). Nếu bạn đang chỉnh sửa văn bản đã được lưu trong một tệp, thì bạn có thể tải lại tệp dưới dạng CP1252 với :e ++enc=cp1252; điều này sẽ làm cho các trích dẫn xoăn có thể nhìn thấy. Nhưng không có lý do thực sự để lại nó như CP1252, chỉ cần xóa 0x910x92ký tự và thay thế chúng bằng dấu nháy đơn.


Bạn thường nhận được dấu ngoặc kép / dấu nháy đơn từ nội dung được sao chép từ MS Word, tự động chèn dấu ngoặc kép / dấu nháy đơn như một phần của tính năng "Báo giá thông minh". Nếu phông chữ của bạn không hỗ trợ các ký tự đó, bạn sẽ chỉ có một khoảng trống thay vì ký tự.
lambacck

1
+1 cho:e ++enc=cp1252
wfaulk

@ChrisJohnsen, Có cách nào để gọi vi bằng một lá cờ hoàn thành điều tương tự :e ++enc=cp1252không? Nếu tôi muốn vi từ dòng lệnh một tệp chứa các ký tự từ MS, thật tốt khi có thể làm điều đó trong một bước, thay vì mở vi và sau đó tải tệp bằng :elệnh
Leo Simon

@LeoSimon: vim --cmd 'set fileencodings=cp1252' /path/to/file- Lệnh chạy trước bình thường .vimrcvà đặt fileencodingstùy chọn (lưu ý kết thúc s; bạn cũng có thể sử dụng tên ngắn hơn fencs) để Vim sẽ chỉ thử CP1252 khi tải tệp. Điều này sẽ hoạt động để chỉnh sửa một lần các tệp như vậy, nhưng nó có thể gây ra sự phức tạp nếu bạn muốn sử dụng phiên bản Vim đó để chỉnh sửa các tệp với các mã hóa khác.
Chris Johnsen

Cảm ơn!, Rõ ràng, tôi hiện đang sử dụngvim -c"set fencs" /path/to/file
Leo Simon

27

91 và 92 là các mã hex cho dấu nháy đơn mở và đóng (trích dẫn đơn) trong phiên bản mặc định của MS Windows của mã hóa latin1 / ISO-8859-1, được gọi cụ thể hơn là cp1252 / Windows-1252 (trong đó cp là viết tắt của mã trang).

Những ký tự này thường được chèn bởi những người sao chép nội dung từ tài liệu Word / email Outlook như một phần của tính năng "Báo giá thông minh". Các ký tự vấn đề khác trong trang mã này là hex 93/94 là các dấu ngoặc kép mở và đóng, dấu đầu dòng (•) và chữ ghép OE (và). Bạn có thể thấy một danh sách đầy đủ các "ký tự vấn đề", những ký tự không ánh xạ trực tiếp vào ISO-8859-1 hoặc UTF-8 với cùng một mã, trên trang Wikipeda cho cp1252 được tô sáng màu xanh lá cây.

Nếu tất cả những gì bạn muốn là mở tệp theo mã hóa chính xác thì hãy sử dụng tùy chọn ++ enc = cp1252 cho lệnh: e:

:e ++enc=1252 filename.txt

Bạn có thể thay thế một mã hex xấu cụ thể trong Vim bằng lệnh thay thế (: s) và một trong các mã thay thế:

\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

Để thay đổi hex 91/92 ký tự, bạn cần thực hiện:

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

Sẽ thật tuyệt khi có lệnh bash để thay thế các ký tự đó trong tất cả các tệp trong thư mục. Tôi đã nghĩ ra điều này từ một tìm kiếm nhanh trên google, sed -i "s/[\x91\x92]/\'/g" *.txtnhưng nó không hoạt động.
Butussy Butkus

Tôi chỉ tìm thấy một cái gì đó dường như làm việc cho dòng lệnh. Điều này không tìm / thay thế cho tất cả các tệp .txt trong thư mục hiện tại. Reasearch perl trước khi sử dụng điều này, mặc dù, bởi vì tôi không biết các công tắc làm gì. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Butussy Butkus

2
sed -i "s/\x92/'/g"đã làm cho tôi.
Karoly Horvath

3

Sử dụng iconvđể chuyển đổi tệp văn bản từ CP1252 sang UTF-8 trước khi mở.

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

Trên Mac OS, hãy sử dụng:

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

-3

Chúng thực sự là viết tắt của hex 91 và 92, trong bảng mã Windows là mở và đóng dấu ngoặc đơn ('và' - Alt-0145 và Alt-0146).

Hãy thử tìm kiếm / thay thế sau đây:

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

1
Tôi không thể downvote do thiếu điểm, nhưng lệnh thay thế này quá sai Tôi không biết bắt đầu từ đâu :(
lambacck

1
Điều này không hiệu quả với tôi: stackoverflow.com/questions/2798398/ cho một giải pháp hoạt động.
Nhầm lẫn

@lambacck: Tôi đã giả sử rằng tệp chứa các chuỗi ký tự "91" và "92", và trong trường hợp đó lệnh này là chính xác. Nếu đây là các ký tự hex, thì bạn đã đúng, bạn cần lệnh thay thế hoặc một cái gì đó tương tự.
Alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.