Sự khác biệt giữa \ e và ^ [


15

Gilles đã viết :

ký tự 27 = 033 = 0x1b = ^[=\e

Demizey đã viết :

^ [chỉ là một đại diện của ESCAPE và \ e được hiểu là một ký tự ESCAPE thực tế

Sau đó, tôi cũng tìm thấy dòng này từ một bài báo của TechRepublic

Đảm bảo bạn viết chuỗi khóa dưới dạng \ e [24 ~ chứ không phải ^ [[24 ~. Điều này là do ^ [chuỗi tương đương với phím [Esc], được biểu thị bằng \ e trong trình bao. Vì vậy, ví dụ, nếu chuỗi khóa là ^ [[OP mã liên kết kết quả sẽ sử dụng sẽ là \ e [OP.

Nhưng tôi đã sử dụng ánh xạ sử dụng ^ [thay vì \ e.

Vậy chúng có thể hoán đổi cho nhau? Khi nào tôi cần sử dụng cái này thay vì cái kia?

Câu trả lời:


16

Nếu bạn xem tiêu chuẩn ANSI ASCII , phần dưới của bộ ký tự (32 đầu tiên) được dành riêng "ký tự điều khiển" (đôi khi được gọi là "chuỗi thoát"). Đây là những thứ như nhân vật NUL, Life Feed, Vận chuyển trở lại, Tab, Chuông, v.v ... Đại đa số có thể được mô phỏng bằng cách nhấn Ctrlphím kết hợp với một phím khác.

Chuỗi thứ 27 (thập phân) hoặc \033chuỗi bát phân hoặc 0x1bchuỗi hex chuỗi Escape. Chúng đều là các đại diện của trình tự điều khiển giống nhau. Các vỏ, ngôn ngữ và công cụ khác nhau đề cập đến trình tự này theo những cách khác nhau. CtrlTrình tự của nó là Ctrl- [, do đó đôi khi được đại diện là ^[, ^là một tay ngắn cho Ctrl.

Bạn có thể nhập các chuỗi ký tự điều khiển dưới dạng một chuỗi thô trên dòng lệnh của mình bằng cách tiến hành chúng với Ctrl- v. Ctrl- vđối với hầu hết các shell và chương trình dừng việc giải thích chuỗi khóa sau và thay vào đó chèn vào dạng thô của nó. Nếu bạn làm điều này bằng Escapephím hoặc Ctrl- vnó sẽ hiển thị trên hầu hết các shell như ^[. Tuy nhiên, mặc dù trình tự này sẽ được diễn giải, nó sẽ không dễ dàng cắt và dán và có thể được giảm xuống thành một chuỗi ký tự không kiểm soát khi gặp phải các giao thức hoặc chương trình nhất định.

Để giải quyết vấn đề này để dễ sử dụng hơn, một số tiện ích nhất định biểu thị chuỗi "thô" bằng \033(theo tham chiếu bát phân), tham chiếu hex \x1bhoặc bằng tham chiếu ký tự đặc biệt \e. Điều này cũng tương tự theo cách \tđược hiểu là một Tab- mà nhân tiện cũng có thể được nhập qua Ctrl- ihoặc \ndưới dạng dòng mới hoặc Enterkhóa, cũng có thể được nhập qua Ctrl- m.

Vì vậy, khi Gilles nói:

27 = 033 = 0x1b = ^ [= \ e

Anh ta đang nói thập phân ASCII 27, bát phân 33, hex 1b, Ctrl- [\etất cả đều bằng nhau, anh ta có nghĩa là tất cả đều đề cập đến cùng một điều (về mặt ngữ nghĩa).

Khi Demizey nói

^ [chỉ là một đại diện của ESCAPE và \ e được hiểu là một ký tự ESCAPE thực tế

Ông có nghĩa ngữ nghĩa, nhưng nếu bạn nhấn Ctrl- v Ctrl- [đây là chính xác giống như \e, trình tự chèn thô sẽ rất có thể được điều trị theo cùng một cách, nhưng điều này không phải luôn luôn được bảo đảm, và vì vậy nó nên sử dụng lập trình di động hơn \ehoặc 0x1bhoặc \033tùy trên ngôn ngữ / shell / tiện ích đang được sử dụng.


4

Tất cả những điều này là đại diện cho nhân vật đó mà một số phần mềm hoặc một số người sử dụng. Tôi liệt kê những cái phổ biến nhất. Nếu bạn đang nói chuyện với một con người, hãy sử dụng bất cứ điều gì họ sẽ hiểu. (Rõ ràng là tôi cố gắng đảm bảo rằng bạn sẽ hiểu ít nhất một trong số những phản hồi này.) Nếu bạn đang nói chuyện với phần mềm, hãy tham khảo tài liệu để biết những gì nó hiểu.

Trong bash, chuỗi thoát \e, \033\x1blàm việc như một cuộc tranh cãi để printf, trong $'…', trong nhắc nhở, và trong tổ hợp phím. Trong các ràng buộc khóa, có một cú pháp tổng quát hơn \C-[hoạt động vì ký tự 27 là những gì bạn nhận được từ việc gõ Ctrl+ [(cú pháp đó là bắt chước các ràng buộc khóa Emacs). \033hoạt động trong tất cả các shell như là một đối số để printf; các bối cảnh và ký hiệu khác phụ thuộc vào vỏ.

Màn hình không nhận ra bất kỳ chuỗi thoát nào trong số này, nhưng nhận ra đó ^là tiền tố điều khiển, do đó ^[có nghĩa là ký tự 27.

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.