Cách in unicode trong python 3

Công cụ sau đây trực quan hóa những gì máy tính đang làm từng bước khi nó thực thi chương trình nói trên

Trình chỉnh sửa mã Python

 

Có một cách khác để giải quyết giải pháp này?

Trước. Viết chương trình Python để tính tích của một danh sách các số nguyên [không sử dụng vòng lặp for].
Tiếp theo. Viết chương trình Python để chứng minh rằng hai biến chuỗi có cùng giá trị trỏ đến cùng một vị trí bộ nhớ.

Mức độ khó của bài tập này là gì?

Dễ dàng trung bình khó

Kiểm tra kỹ năng Lập trình của bạn với bài kiểm tra của w3resource



con trăn. Lời khuyên trong ngày

In nâng cao

Bạn có muốn in nhiều giá trị bằng dấu tách do người dùng xác định không?

Một điểm khác biệt đáng chú ý giữa Python 2 và Python 3 là dữ liệu ký tự được lưu trữ bằng Unicode thay vì byte. Rất có khả năng là khi di chuyển mã hiện có và viết mã mới, bạn có thể không biết về sự thay đổi này vì hầu hết các thuật toán chuỗi sẽ hoạt động với một trong hai kiểu biểu diễn;

Nếu bạn đang làm việc với các thư viện dịch vụ web chẳng hạn như urllib [trước đây là urllib2] và các yêu cầu, ổ cắm mạng, tệp nhị phân hoặc I/O nối tiếp với pySerial  thì bạn sẽ thấy rằng dữ liệu hiện được lưu trữ dưới dạng chuỗi byte

You are most likely to notice problems when comparing data against string constants. Comparing Unicode strings against byte strings will fail: either raising a TypeError when using an ordered comparison [=] or always returning False with equality/inequality.

nội dung

  • Bộ ký tự … một chút lịch sử
  • bảng chữ cái
  • Hạn chế đối với Unicode
  • Python và Unicode
  • Chuỗi Python và Byte
  • Chuỗi mã hóa và giải mã
  • định dạng chuỗi
  • Bản tóm tắt

Bộ ký tự … một chút lịch sử

Nếu bạn đã quen thuộc với Unicode hoặc đã gặp ánh xạ bộ ký tự, bạn có thể bỏ qua phần Python và Unicode

Máy tính chỉ làm việc với các số để xử lý văn bản, mỗi ký tự được gán một số duy nhất được gọi là mã ký tự của nó. Bạn gần như chắc chắn đã quen thuộc với ASCII xác định mã tiêu chuẩn cho 128 ký tự. ASCII xác định 95 ký tự hiển thị và 33 ký tự không in được như dấu cách, nguồn cấp dữ liệu xuống dòng [thường được gọi là dòng mới], tab, thoát và xuống dòng [được tạo bởi phím Enter]. Nó có từ năm 1963 và được thiết kế để sử dụng trong điện báo và liên lạc nối tiếp bằng cách sử dụng 7 trong số 8 bit có sẵn trong một byte [bit trên cùng được sử dụng làm bit chẵn lẻ để kiểm tra lỗi]

ASCII chỉ xác định mã cho các ký tự và ký hiệu tiếng Anh thường được sử dụng ở Hoa Kỳ. Mặc dù nó có mã cho ký hiệu đô la [$ mã #24 hoặc 36 thập phân], nhưng nó không có mã cho bảng Anh [£], Yên [ ¥¥¥¥¥¥¥¥¥¥¥] or Euro [] currency symbols.

Sau khi dữ liệu bắt đầu được lưu trữ trên đĩa hoặc được truyền qua các giao thức mạng kiểm tra lỗi, bit thứ 8 của mỗi byte có thể được sử dụng để ánh xạ thêm 128 ký tự. Tuy nhiên, có rất nhiều cách điều này có thể được, và đã được định nghĩa. Trong khi một bộ ASCII mở rộng [8-bit] được thêm vào trong các ký hiệu GBP và Yen, nó đã định nghĩa trước định nghĩa của đồng Euro.

Nhiều định nghĩa cho bộ mã 8 bit đã được phát triển sau Extended ASCII với định nghĩa phổ biến nhất ở Anh là Latin-1 [ISO-8859-1] và Microsoft CP1252. Cả hai bảng mã đều ánh xạ các ký hiệu GP Pound và Yên cũng như một số ký tự có dấu Tây Âu. Các bộ không tương thích 100% với nhau và không bao gồm biểu tượng Euro

Đồng Euro cuối cùng đã được xác định trong ISO-8859-15, về cơ bản là 8859-1 với một số thay đổi nhỏ đối với các ký tự nên nhiều trang web có thể sử dụng 8859-15 nhưng vẫn gọi nó là 8859-1. Đồng Euro đã được thêm vào CP1252 phiên bản 3

Tất cả những điều này chỉ thêm vào sự nhầm lẫn chung về ánh xạ bộ ký tự và có một danh sách ít nhất 50 tiêu chuẩn mã hóa ký tự khác nhau trên Wikipedia

bảng chữ cái

Vào cuối những năm 1980, những nỗ lực đã được thực hiện để xác định một bộ ký tự phổ quát [Unicode] bằng cách sử dụng hai byte sẽ xác định duy nhất hơn 65.000 ký tự khác nhau. Điều này bao gồm các ký tự phương Tây, Hy Lạp, Cyrillic, Ả Rập, Coptic và các ký tự khác ở Châu Âu và Trung Đông, cộng với các bộ ký tự Châu Á bao gồm Kanji được sử dụng ở Nhật Bản và Trung Quốc

256 ký tự đầu tiên của Unicode giống như các ký tự ISO-8859-1 [Latin-1]. Đồng Euro được định nghĩa chính thức là mã #20AC

Unicode được dùng để mã hóa các ký tự được sử dụng rộng rãi trong các ngôn ngữ hiện đại bằng 2 byte. Năm 1996, Unicode 2 đã xác định các mặt phẳng mở rộng cho phép mã ký tự bốn byte hỗ trợ ánh xạ cho các bộ ký tự lịch sử và chuyên biệt

Các ký tự được xác định bằng Unicode 2 mã D800–DBFF dưới dạng điểm mã thay thế cao phải được theo sau bởi mã hai byte thứ hai [điểm thay thế thấp]. Mặc dù yêu cầu bốn byte, cả hai kết hợp với nhau tạo thành mã ba byte cho các ký tự từ 10000 đến 10FFF [trong thông số kỹ thuật hiện tại]. Biểu tượng cảm xúc là một ví dụ điển hình về mã yêu cầu điểm mở rộng bốn byte. khuôn mặt hạnh phúc ? . is character code 1F642 [encoded as D83DDE42].

Tính đến bài đăng trên blog này, có hơn 137.000 ký tự Unicode. Ngoài ra còn có một số ánh xạ Unicode không chính thức bao gồm các tập lệnh được xây dựng cho các ngôn ngữ như pIqad Klingon

Hạn chế đối với Unicode

Nhược điểm rõ ràng của Unicode là cần sử dụng hai byte cho mỗi ký tự. Điều này làm tăng mức tiêu thụ bộ nhớ, mức sử dụng đĩa, số lần I/O và giảm tốc độ truyền dữ liệu

Để hỗ trợ phương pháp xử lý bộ ký tự phương Tây hiệu quả hơn, sơ đồ mã hóa UTF-8 đã được xác định sử dụng tối đa bốn byte để lưu trữ bất kỳ ký tự Unicode nào. Mã ASCII yêu cầu một byte đơn, mã lên tới 7FF yêu cầu hai byte [điều này bao gồm hầu hết các ký tự Châu Âu, Trung Đông và Cyrillic]. Mã ký tự lên đến FFFF yêu cầu ba byte và phần còn lại yêu cầu bốn. Điều này có nghĩa là biểu tượng Euro [20AC] yêu cầu ba byte trong khi biểu tượng cảm xúc như khuôn mặt hạnh phúc [1F642] yêu cầu bốn byte

Python và Unicode

Bàn chải đầu tiên của bạn với chuỗi Python Unicode có thể xảy ra khi đọc tệp văn bản và bạn gặp lỗi mã hóa hoặc các ký tự không hiển thị chính xác trên màn hình

Python 3 tạo đối tượng TextIO khi đọc tệp văn bản và điều này sử dụng mã hóa mặc định để ánh xạ byte trong tệp thành ký tự Unicode. Trong Linux và OSX, mã hóa mặc định là UTF-8, trong khi Windows giả định CP1252

Nếu tệp văn bản của bạn không sử dụng mã hóa mặc định do Python đảm nhận, bạn sẽ cần chỉ định mã hóa khi mở tệp. Để đọc tệp được mã hóa bằng Latin-1 [ISO-8859-1], hãy sử dụng 'latin_1'

with open['example.txt', mode='r', encoding='latin_1']:
    pass

Danh sách đầy đủ các mã hóa được hỗ trợ có trên trang Python API codecs

Tất cả các chuỗi ký tự Python 3 đều là Unicode. Sử dụng ký tự thoát chữ thường \u với 4 chữ số [\uxxxx] để xác định mã lên đến FFFF. Để xác định việc sử dụng ký hiệu Euro

euro = '\u20AC'

Đối với các giá trị Unicode trên FFFF, hãy sử dụng chữ hoa \U với 8 chữ số [\Uxxxxxxxx]. Biểu tượng cảm xúc khuôn mặt hạnh phúc sẽ là

smile = '\U0001F642'

Nếu bạn in giá trị này, nó sẽ chỉ hiển thị khuôn mặt vui vẻ nếu thiết bị đầu ra của bạn hỗ trợ biểu tượng cảm xúc [dấu nhắc lệnh và IDE thường không có]

Nếu bạn đã sử dụng văn bản Unicode trong Python 2, bạn sẽ quen thuộc với chuỗi ký tự Unicode được xác định bằng cách sử dụng tiền tố u cho chuỗi ký tự [u'Hello world. ’]. Ký hiệu này vẫn được hỗ trợ trong Python 3 – không còn cần thiết nữa

Chuỗi Python và Byte

Nếu bạn làm việc với các kết nối dữ liệu cấp thấp như đường nối tiếp hoặc ổ cắm mạng [bao gồm kết nối web và Bluetooth], bạn sẽ thấy rằng Python 3 truyền dữ liệu dưới dạng chuỗi byte. byte kiểu dữ liệu. Tương tự nếu bạn mở một tệp ở chế độ nhị phân, bạn sẽ làm việc với các chuỗi byte

Chuỗi byte hỗ trợ hầu hết các phương thức được cung cấp với chuỗi Unicode [kiểu dữ liệu str]. Nếu mã của bạn sử dụng các phương thức chuỗi, chỉ số con và lát thì rất có khả năng tiếp tục làm việc với chuỗi byte

Tuy nhiên, các phương thức lấy tham số chuỗi [chẳng hạn như startedwith] sẽ không thành công nếu bạn chuyển một chuỗi ký tự [hằng số] vì mã của bạn sẽ chuyển một chuỗi ký tự Unicode sang một phương thức chuỗi byte. Để xác định chuỗi byte, hãy sử dụng tiền tố b cho chuỗi ký tự. Ví dụ

byte_hello = b'Hello world!'

Các chuỗi byte hỗ trợ các ký tự thoát dấu gạch chéo ngược thông thường và có thể chứa các mã thập lục phân như trong ‘\xA3’ cho ký hiệu bảng Anh GB [giả sử bộ ký tự Latin_1]. Bạn có thể xác định các chuỗi byte thô để tắt nhận dạng thoát dấu gạch chéo ngược bằng tiền tố chuỗi br hoặc rb

Lưu ý rằng hai biểu diễn chuỗi không tương thích nên biểu thức sau luôn Sai

'Hello world' == b'Hello world!'

Không hỗ trợ phương thức định dạng trong chuỗi byte – định dạng chuỗi chỉ được hỗ trợ với chuỗi Unicode. Nếu bạn in ra một chuỗi byte bằng một chuỗi định dạng, bạn sẽ luôn thấy dạng biểu diễn chuỗi byte. Ví dụ

message = b'world'
print['Hello {}!'.format[message]]

sẽ xuất ra như

Hello b'world'!

Chuỗi mã hóa và giải mã

Để chuyển đổi chuỗi byte thành Unicode, hãy sử dụng str. phương thức giải mã [] chấp nhận tham số mã hóa. Mã hóa mặc định là UTF-8 cho tất cả các nền tảng. Chúng ta có thể sửa ví dụ trước thành

print['Hello {}!'.format[message.decode[]]]

Nếu chúng tôi đang làm việc với bộ ký tự Windows CP1252 và đã đọc văn bản từ tệp nhị phân, chúng tôi sẽ sử dụng [dữ liệu là chuỗi byte]

________số 8

Để chuyển đổi Unicode thành chuỗi byte, hãy sử dụng byte. encode[] , một lần nữa với tham số mã hóa tùy chọn [mặc định UTF-8. ] Để viết thông báo xin chào thế giới của chúng tôi vào tệp văn bản Windows CP1252, chúng tôi sẽ sử dụng

message = 'world'
with open['hello.txt', 'wb'] as fp:
    fp.write['Hello {}!'.format[message].encode['cp1252']]

Trong thực tế, với ví dụ này, có lẽ chúng ta chỉ cần viết riêng các chuỗi byte hoặc có thể sử dụng phép nối chuỗi

euro = '\u20AC'
0

định dạng chuỗi

Là một lập trình viên Python 2, đặc biệt là với nền tảng C, bạn có thể đã sử dụng toán tử % để định dạng đầu ra. Điều này vẫn được hỗ trợ trong Python 3 cho cả chuỗi Unicode và chuỗi byte. Tuy nhiên, chuỗi định dạng và mọi tham số chuỗi phải cùng loại. Để sử dụng định dạng kiểu printf chuỗi byte, hãy sử dụng

euro = '\u20AC'
1

Nhưng nếu bạn chưa chuyển sang Format Strings [kể từ Python 2. 7] bạn thực sự nên làm như vậy vì chúng mạnh hơn nhiều so với kiểu printf. Cách tiếp cận được khuyến nghị để định dạng đầu ra là sử dụng hàm str. phương thức định dạng[]. Ở dạng đơn giản nhất, chuỗi định dạng sử dụng dấu ngoặc nhọn để biểu thị một tham số có thể thay thế với các quy ước về kiểu dữ liệu và độ rộng trường tương tự như printf

euro = '\u20AC'
2

Trăn 3. 6 đã giới thiệu một tính năng Formatted String Literals mới sử dụng tiền tố f trên chuỗi Unicode để cho phép bất kỳ biểu thức Python nào trong dấu ngoặc nhọn. Thường được viết tắt thành f-string, chúng tránh nhu cầu gọi phương thức format[] cho các trường hợp định dạng đơn giản, chẳng hạn như biến thể này trong ví dụ hello world

euro = '\u20AC'
3

Trên thực tế, bất kỳ biểu thức Python hợp lệ nào cũng có thể được sử dụng với dấu ngoặc nhọn, vì vậy chắc chắn có thể gọi các hàm và thực hiện các phép tính như

euro = '\u20AC'
4

Nhưng đây có lẽ không phải là một ý tưởng hay trong thực tế vì rất khó xác định biểu thức [ngẫu nhiên. random[]**2] từ định dạng [. 2f] trong chuỗi ký tự. Bám sát các tên biến đơn giản như trong ví dụ đầu tiên

Nếu bạn sử dụng các chuỗi ký tự được định dạng thì không thể thiếu một IDE phân tích chuỗi f vì nó sẽ làm nổi bật các lỗi cú pháp và tên biến không chính xác

Tại thời điểm viết bài, PyCharm nêu bật cả lỗi cú pháp và tên biến không chính xác. Trong số các IDE Python phổ biến khác [Atom, Eclipse/pydev, Spyder và VS Code] có hỗ trợ hạn chế cho việc kiểm tra cú pháp [không phải lúc nào cũng chính xác] nhưng không có kiểm tra ngữ nghĩa cho tên biến. Điều đó có thể đã thay đổi khi bạn đọc nó, vì vậy hãy đảm bảo rằng IDE của bạn được cập nhật để bạn nhận được hỗ trợ f-string khi có sẵn

Bản tóm tắt

Lớp chuỗi Python 3 [str] lưu trữ các chuỗi Unicode và một lớp chuỗi byte mới [byte] hỗ trợ các chuỗi byte đơn. Hai loại này khác nhau nên các biểu thức chuỗi phải sử dụng dạng này hay dạng khác. Chuỗi ký tự là Unicode trừ khi có tiền tố là chữ thường b

Chuyển đổi sang Unicode yêu cầu kiến ​​thức về mã hóa bộ ký tự cơ bản với UTF-8 được sử dụng phổ biến nhất, đặc biệt là trên các trang web. Để chuyển đổi chuỗi byte thành Unicode, hãy sử dụng byte. phương thức giải mã [] và sử dụng str. encode[] để chuyển đổi Unicode thành chuỗi byte. Cả hai phương pháp đều cho phép mã hóa bộ ký tự được chỉ định làm tham số tùy chọn nếu yêu cầu một thứ khác ngoài UTF-8

Một chuỗi ký tự được định dạng mới [hoặc chuỗi f] cho phép các biểu thức được đánh giá trong dấu ngoặc nhọn của chuỗi định dạng, cung cấp một cách tiếp cận thay thế cho việc sử dụng str. phương thức định dạng[]

  • Về
  • Bài viết mới nhất

Trái phiếu Martin

Cộng tác viên hướng dẫn tại Feabhas Ltd

Một huấn luyện viên CNTT độc lập Martin có hơn 40 năm kinh nghiệm học thuật và thương mại trong kỹ thuật phần mềm hệ thống mở. Ông đã làm việc với nhiều loại công nghệ từ bộ điều khiển quy trình thời gian thực, thông qua trình biên dịch, đến các hệ thống xử lý song song quy mô lớn;

Làm cách nào để in bằng Unicode trong Python?

Để in bất kỳ ký tự nào trong trình thông dịch Python, hãy sử dụng \u để biểu thị ký tự unicode và sau đó nhập mã ký tự theo sau . Chẳng hạn, mã cho β là 03B2, vì vậy để in β lệnh là print['\u03B2'].

Python 3 có hỗ trợ Unicode không?

Kể từ Python 3. 0, kiểu str của ngôn ngữ chứa các ký tự Unicode , nghĩa là bất kỳ chuỗi nào được tạo bằng cách sử dụng "đá unicode. " , 'đá unicode. ' hoặc cú pháp chuỗi trích dẫn ba lần được lưu trữ dưới dạng Unicode.

Cách in UTF

Sử dụng chuỗi thoát "\u" để in các ký tự Unicode Trong một chuỗi, hãy đặt "\u" trước bốn chữ số thập lục phân đại diện cho một điểm mã Unicode. Sử dụng print[] để in chuỗi.

Cách kiểm tra UTF

String encode[] Tham số . Nó trả về một phiên bản được mã hóa utf-8 của chuỗi. Trong trường hợp không thành công, nó sẽ tạo ra một ngoại lệ UnicodeDecodeError.

Chủ Đề