unicode_escape
nói chung không hoạt động
Nó chỉ ra rằng giải pháp ____10 hoặc unicode_escape
không hoạt động nói chung - đặc biệt, nó không hoạt động với sự hiện diện của unicode thực tế.
Nếu bạn có thể chắc chắn rằng mọi nhân vật không phải ASCII sẽ bị thoát ra [và hãy nhớ, bất cứ điều gì ngoài 128 ký tự đầu tiên là không phải ASCII], unicode_escape
sẽ làm điều đúng đắn cho bạn. Nhưng nếu có bất kỳ ký tự không phải là ASCII nào đã có trong chuỗi của bạn, mọi thứ sẽ sai.
unicode_escape
về cơ bản được thiết kế để chuyển đổi byte thành văn bản Unicode. Nhưng ở nhiều nơi - ví dụ, mã nguồn Python - dữ liệu nguồn đã là văn bản Unicode.
Cách duy nhất này có thể hoạt động chính xác là nếu bạn mã hóa văn bản thành byte trước. UTF-8 là mã hóa hợp lý cho tất cả các văn bản, vì vậy điều đó sẽ hoạt động, phải không?
Các ví dụ sau đây là trong Python 3, do đó các chuỗi chữ sẽ sạch hơn, nhưng cùng một vấn đề tồn tại với các biểu hiện hơi khác nhau trên cả Python 2 và 3.
>>> s = 'naïve \\t test'
>>> print[s.encode['utf-8'].decode['unicode_escape']]
naïve test
Vâng, điều đó là sai.
Cách mới được đề xuất để sử dụng codec giải mã văn bản thành văn bản là gọi trực tiếp
>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
4. cái đó có giúp ích không?>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
Không có gì. [Ngoài ra, ở trên là unicodeerror trên Python 2.]
Codec unicode_escape
, mặc dù tên của nó, hóa ra cho rằng tất cả các byte không ASCII đều thuộc mã hóa Latin-1 [ISO-8859-1]. Vì vậy, bạn sẽ phải làm điều đó như thế này:
>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
Nhưng điều đó thật khủng khiếp. Điều này giới hạn bạn đối với 256 ký tự Latin-1, như thể Unicode chưa bao giờ được phát minh ra!
>>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
Thêm một biểu thức chính quy để giải quyết vấn đề
[Đáng ngạc nhiên, bây giờ chúng tôi không có hai vấn đề.]
Những gì chúng ta cần làm chỉ là áp dụng bộ giải mã unicode_escape
cho những thứ mà chúng ta chắc chắn là văn bản ASCII. Cụ thể, chúng tôi có thể đảm bảo chỉ áp dụng nó cho các chuỗi thoát Python hợp lệ, được đảm bảo là văn bản ASCII.
Kế hoạch là, chúng tôi sẽ tìm thấy các chuỗi thoát bằng cách sử dụng biểu thức thông thường và sử dụng hàm làm đối số cho
>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
7 để thay thế chúng bằng giá trị không được phân loại của chúng.import re
import codecs
ESCAPE_SEQUENCE_RE = re.compile[r'''
[ \\U........ # 8-digit hex escapes
| \\u.... # 4-digit hex escapes
| \\x.. # 2-digit hex escapes
| \\[0-7]{1,3} # Octal escapes
| \\N\{[^}]+\} # Unicode characters by name
| \\[\\'"abfnrtv] # Single-character escapes
]''', re.UNICODE | re.VERBOSE]
def decode_escapes[s]:
def decode_match[match]:
return codecs.decode[match.group[0], 'unicode-escape']
return ESCAPE_SEQUENCE_RE.sub[decode_match, s]
Và với điều đó:
>>> print[decode_escapes['Ernő \\t Rubik']]
Ernő Rubik
Trình tự thoát là sự kết hợp của các ký tự [thường có tiền tố với ký tự thoát], có cách giải thích ký tự không theo chữ. Do đó, các chuỗi ký tự được coi là một chuỗi thoát có một ý nghĩa khác với các ký tự theo nghĩa đen có trong đó. Hầu hết các ngôn ngữ lập trình sử dụng dấu gạch chéo ngược \ làm nhân vật thoát. Nhân vật này được sử dụng như một trình khởi tạo trình tự thoát, bất kỳ ký tự nào [một hoặc nhiều] sau đây được hiểu là một chuỗi thoát. Nếu một chuỗi thoát được chỉ định cho một ký tự không thể in hoặc mã điều khiển, thì chuỗi được gọi là ký tự điều khiển. & NBSP;
Danh sách trình tự thoát trong Python:
\ | Trích dẫn duy nhất |
\ ” | Báo giá kép |
\\ | dấu vết chéo ngược |
\ n & nbsp; | Dòng mới |
\ r | Vận chuyển trở lại |
\ t | Tab ngang |
\ b | Backspace |
\ f | thức ăn dạng |
\ v | Tab dọc |
\ 0 | Nhân vật null |
\ N {name} | Cơ sở dữ liệu ký tự Unicode có tên Tra cứu |
\ uxxxxxxxxx | Ký tự unicode với giá trị hex 16 bit xxxx |
\ Uxxxxxxxxx | Ký tự unicode với giá trị hex 32 bit xxxxxxxx |
\ ooo | Nhân vật có giá trị bát phân ooo |
\ XHH | Nhân vật có giá trị hex hh |
Bảng trên được áp dụng cho ngôn ngữ lập trình Python, vì các ngôn ngữ khác nhau có các chuỗi điều khiển và ký tự điều khiển khác nhau để bảng trên có thể không hoạt động trong ngôn ngữ lập trình của bạn. Bán tại. Trình thông dịch dòng lệnh Windows sử dụng một Caret [ ^] để thoát khỏi các ký tự, và do đó, bảng trên won được áp dụng ở đó.^ ] to escape characters, and therefore the above table won’t be applicable there.
Thoát giải thích trình tự
Giải thích trình tự thoát được thực hiện, khi gặp dấu gạch chéo ngược trong một chuỗi. Sau cuộc gặp gỡ của một dấu gạch chéo ngược [bên trong một chuỗi], bất kỳ ký tự sau [với [\]] sẽ được xem trên bảng đã nói ở trên. Nếu một trận đấu được tìm thấy thì chuỗi được bỏ qua từ chuỗi và bản dịch của nó được liên kết với chuỗi được sử dụng. Nếu không tìm thấy một trận đấu, thì không có tra cứu nào xảy ra và trình tự điều khiển được sao chép như nó là. & NBSP;\ ]] would be looked upon the aforementioned table. If a match is found then the sequence is omitted from the string, and its translation associated with the sequence is used. If a match is not found, then no lookup happens, and the control sequence is copied as it is.
Thí dụ
Python3
>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
8>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
9>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
0>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
1>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
8>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
9>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
4>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
1Output:
I will go Home See you\jtommorow
Như đã thấy trong đầu ra ở trên, câu lệnh in đầu tiên tạo ra một đầu ra trong đó \ t được giải quyết thành một tab dọc và được bỏ qua trong đầu ra. Mặt khác, trong tuyên bố in thứ hai, \ J vẫn tồn tại, vì không có giải pháp pháp lý nào cho chuỗi đó tồn tại.\t got resolved into a vertical tab and is omitted in the output. On the other hand, in the second print statement, the \j persists, as no legal resolution for that sequence exists.
Ngăn chặn sự giải thích trình tự thoát
Có những trường hợp chúng tôi không muốn các chuỗi hành xử theo cách này. Trong những trường hợp đó, chúng tôi thường muốn bảo tồn các dấu gạch chéo ngược. Một số tình huống có thể yêu cầu điều này là:
- Chuỗi chứa một mạng hoặc đường dẫn cục bộ
- Chuỗi chứa regex, sẽ được xử lý thêm bởi động cơ regex
Phương pháp phòng ngừa
Phương pháp 1:
Liên tục nhân đôi các dấu gạch chéo ngược, cũng cho phép chúng tôi khắc phục các vấn đề như vậy. Trong phương pháp này, chúng tôi theo cách thủ công mọi dấu gạch chéo ngược trong chuỗi và nối lại một dấu gạch chéo ngược khác với nó [ở vị trí ngay lập tức]. Nói chung, một phương pháp tẻ nhạt, và chỉ khuyên nếu kích thước chuỗi ít hơn. & NBSP;
Python3
>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
6>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
7 >>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
8>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
8>>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
0>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
6>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
7 >>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
3>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
8>>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
0Output:
I love to use instead of using 4 spaces I love to use \t instead of using 4 spaces
Phương pháp 2:
Sử dụng Riêu. Thường được gọi là các chuỗi thô, được sử dụng để bảo tồn các chuỗi thoát như nghĩa đen. Sao cho nó thực hiện những gì phương pháp trước đó đã làm nhưng tự động [không yêu cầu sự can thiệp của con người]. Để biến một chuỗi bình thường thành một chuỗi thô, tiền tố chuỗi [trước khi báo giá] với R hoặc R. Đây là phương pháp được lựa chọn để khắc phục vấn đề trình tự thoát này. & NBSP;r’….’ or R’…..’ construct. Commonly referred to as raw strings, which is used to preserve the escape sequences as literals. Such that it does what the previous method did but automatically [does not require human intervention]. For turning a normal string into a raw string, prefix the string [before the quote] with an r or R. This is the method of choice for overcoming this escape sequence problem.
Python3
>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
6>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
7 >>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
8>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
8>>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
0>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
6>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
7 import re
import codecs
ESCAPE_SEQUENCE_RE = re.compile[r'''
[ \\U........ # 8-digit hex escapes
| \\u.... # 4-digit hex escapes
| \\x.. # 2-digit hex escapes
| \\[0-7]{1,3} # Octal escapes
| \\N\{[^}]+\} # Unicode characters by name
| \\[\\'"abfnrtv] # Single-character escapes
]''', re.UNICODE | re.VERBOSE]
def decode_escapes[s]:
def decode_match[match]:
return codecs.decode[match.group[0], 'unicode-escape']
return ESCAPE_SEQUENCE_RE.sub[decode_match, s]
3>>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
8>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
8>>> print['Ernő \\t Rubik'.encode['latin-1'].decode['unicode_escape']]
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range[256]
0Output:
C:\Program Files ortonppx C:\Program Files\norton\appx
Các vấn đề do ký tự thoát có thể không phải lúc nào cũng dẫn đến đầu ra không mong muốn, mà còn lỗi. Ví dụ: mã dưới đây khi thực thi sẽ tạo ra lỗi.
Python3
>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
8>>> import codecs
>>> print[codecs.decode[s, 'unicode_escape']]
naïve test
9import re
import codecs
ESCAPE_SEQUENCE_RE = re.compile[r'''
[ \\U........ # 8-digit hex escapes
| \\u.... # 4-digit hex escapes
| \\x.. # 2-digit hex escapes
| \\[0-7]{1,3} # Octal escapes
| \\N\{[^}]+\} # Unicode characters by name
| \\[\\'"abfnrtv] # Single-character escapes
]''', re.UNICODE | re.VERBOSE]
def decode_escapes[s]:
def decode_match[match]:
return codecs.decode[match.group[0], 'unicode-escape']
return ESCAPE_SEQUENCE_RE.sub[decode_match, s]
9>>> print[s.encode['latin-1'].decode['unicode_escape']]
naïve test
1Tạo ra lỗi sau
in [C C: \ users \ Desktop \ json,] & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;
^
SyntaxError: [unicode error] ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape
Lỗi được gây ra bởi vì & nbsp; Dẫn đến một lỗi là ký tự tiếp theo là S & NBSP; nằm ngoài phạm vi 16 cơ sở. & nbsp;\U in the string leads to the next 4 characters being treated as a 32-bit Hexadecimal value which would correspond to a Unicode code point. Which leads to an error as the next character is s which are outside the base 16 range.