Hướng dẫn how many byte is a char in python? - bao nhiêu byte là một char trong python?

Có một số chức năng sẽ cho tôi biết một chuỗi có bao nhiêu byte trong bộ nhớ?

Tôi cần đặt kích thước của bộ đệm ổ cắm để chuyển toàn bộ chuỗi cùng một lúc.

Hỏi ngày 25 tháng 10 năm 2010 lúc 9:20Oct 25, 2010 at 9:20

Hướng dẫn how many byte is a char in python? - bao nhiêu byte là một char trong python?

Richard Knoprichard KnopRichard Knop

78.5K146 Huy hiệu vàng388 Huy hiệu bạc546 Huy hiệu đồng146 gold badges388 silver badges546 bronze badges

3

Nếu đó là Python 2.x

>>> len("你好".encode("utf8"))
6
7, hãy lấy
>>> len("你好".encode("utf8"))
6
8 của nó. Đó là Python 3.x
>>> len("你好".encode("utf8"))
6
7 (hoặc Python 2.x
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
0), lần đầu tiên mã hóa thành
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
1 (hoặc
>>> len("你好".encode("utf8"))
6
7, tương ứng) đối tượng str.


Ví dụ: các ký tự ASCII sử dụng mỗi ký tự 1 byte:

>>> len("hello".encode("utf8"))
5

Trong khi đó, người Trung Quốc sử dụng 3 byte mỗi byte:

>>> len("你好".encode("utf8"))
6

Đã trả lời ngày 25 tháng 10 năm 2010 lúc 9:48Oct 25, 2010 at 9:48

2

import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.

Nhưng thực sự bạn cần phải biết độ dài đại diện của nó, vì vậy một cái gì đó như

import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
5 là đủ.

Đã trả lời ngày 25 tháng 10 năm 2010 lúc 9:23Oct 25, 2010 at 9:23

Eumiroeumiroeumiro

200K34 Huy hiệu vàng295 Huy hiệu bạc259 Huy hiệu Đồng34 gold badges295 silver badges259 bronze badges

8

Di chuyển từ Python 2 đến 3? Đây là những gì bạn cần biết về chuỗi và vai trò của chúng trong nâng cấp của bạn.

Một trò đùa cũ hỏi "Bạn gọi ai đó nói ba ngôn ngữ là gì? Nguyên ngữ. Hai ngôn ngữ? Ngôn ngữ. Một ngôn ngữ? Người Mỹ."

Bây giờ tôi đã nổi giận thành công tất cả các độc giả người Mỹ của mình, tôi có thể đi đến điểm, đó là bởi vì rất nhiều công nghệ máy tính đã được phát triển ở các quốc gia nói tiếng Anh và đặc biệt là ở Hoa Kỳ Bỏ qua các công nghệ máy tính sớm. Tiêu chuẩn được thiết lập vào những năm 1960 để dịch các số thành các ký tự (và trở lại), được gọi là ASCII (Mã tiêu chuẩn của Hoa Kỳ để trao đổi thông tin), đã tính đến tất cả các chữ cái, số và ký hiệu cần thiết để làm việc với tiếng Anh. Và đó là tất cả những gì nó có thể xử lý, cho rằng đó là một mã hóa bảy byte (nghĩa là, 128 ký tự).

Nếu bạn sẵn sàng bỏ qua các chữ cái có dấu, ASCII có thể, loại, làm việc với các ngôn ngữ khác, cũng như thời điểm bạn muốn làm việc với một nhân vật khác, chẳng hạn như tiếng Trung hoặc tiếng Do Thái, bạn không may mắn . Các biến thể trên ASCII, chẳng hạn như ISO-8859-X (với một số giá trị cho "x"), đã giải quyết vấn đề ở một mức độ hạn chế, nhưng có rất nhiều vấn đề với hệ thống đó.

Unicode cung cấp cho mỗi nhân vật, trong mọi ngôn ngữ trên toàn cầu, một số duy nhất. Điều này cho phép bạn đại diện (chỉ về) mọi nhân vật trong mỗi ngôn ngữ. Vấn đề là làm thế nào bạn có thể biểu diễn những con số đó bằng cách sử dụng byte. Rốt cuộc, vào cuối ngày, byte vẫn là cách dữ liệu được lưu trữ và đọc từ các hệ thống tập tin, cách dữ liệu được biểu diễn trong bộ nhớ và cách truyền dữ liệu qua mạng. Trong nhiều ngôn ngữ và hệ điều hành, mã hóa được sử dụng là UTF-8. Hệ thống khéo léo này sử dụng các số byte khác nhau cho các ký tự khác nhau. Các ký tự xuất hiện trong ASCII tiếp tục sử dụng một byte duy nhất. Một số bộ nhân vật khác (ví dụ, tiếng Ả Rập, tiếng Hy Lạp, tiếng Do Thái và tiếng Nga) sử dụng hai byte trên mỗi ký tự. Và những người khác (như Trung Quốc và biểu tượng cảm xúc) sử dụng ba byte trên mỗi ký tự.

Trong một ngôn ngữ lập trình hiện đại, bạn không cần phải lo lắng về những thứ này quá nhiều. Nếu bạn nhận được đầu vào từ hệ thống tập tin, người dùng hoặc mạng, nó sẽ chỉ đến dưới dạng ký tự. Có bao nhiêu byte mà mỗi nhân vật cần là một chi tiết triển khai mà bạn có thể (hoặc nên có thể) bỏ qua.

Tại sao tôi đề cập đến điều này? Bởi vì ngày càng có nhiều khách hàng của tôi đã bắt đầu nâng cấp từ Python 2 lên Python 3. Vâng, Python 3 đã có một thập kỷ, nhưng sự kết hợp của một số cải tiến lớn trong các phiên bản gần đây nhất và nhận ra rằng chỉ còn 18 tháng Trước khi Python 2 không được yêu cầu, nhiều công ty nhận ra, "Gee, có lẽ cuối cùng chúng ta cũng nên nâng cấp."

Điểm gắn bó chính cho nhiều người trong số họ? Các byte so với vấn đề ký tự.

Vì vậy, trong bài viết này, tôi bắt đầu xem xét điều này có nghĩa là gì và làm thế nào để đối phó với nó, bắt đầu bằng việc kiểm tra byte so với các ký tự trong Python 2. Trong bài viết tiếp theo của tôi, tôi dự định xem Python 3 và làm thế nào việc nâng cấp có thể được Tricky ngay cả khi bạn biết chính xác khi nào bạn muốn byte và khi bạn muốn ký tự.

Chuỗi cơ bản

Theo truyền thống, các chuỗi Python được xây dựng từ byte, đó là, bạn có thể nghĩ về một chuỗi Python như một chuỗi các byte. Nếu những byte đó tình cờ phù hợp với các nhân vật, như trong ASCII, bạn đang ở trong tình trạng tuyệt vời. Nhưng nếu những byte đó là từ một bộ nhân vật khác, bạn cần phải suy nghĩ lại về mọi thứ một chút. Ví dụ:


>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
8
>>> s = '你好'  # Chinese
>>> len(s)
6

Những gì đang xảy ra ở đây? Python 2 cho phép bạn nhập bất kỳ ký tự nào bạn muốn, nhưng nó không thấy đầu vào là ký tự. Thay vào đó, nó chỉ xem họ như byte. Nó gần như là bạn đã đi đến một thợ máy và nói, "Có một vấn đề với chiếc xe của tôi", và thợ máy của bạn nói, "Tôi không thấy một chiếc xe hơi. Tôi thấy bốn cửa, kính chắn gió, bình xăng, Động cơ, bốn bánh xe và lốp xe ", v.v. Python đang chú ý đến các bộ phận riêng lẻ, nhưng không phải là nhân vật được xây dựng từ những phần đó.

Kiểm tra độ dài của một chuỗi là một nơi mà bạn thấy vấn đề này. Một cách khác là khi bạn muốn in chỉ một phần của chuỗi. Ví dụ, nhân vật đầu tiên trong chuỗi Trung Quốc là gì? Nó phải là ký tự 你 & nbsp ;, nghĩa là "bạn":


>>> print(s[0])


Kinh quá! Đó là một cách ngoạn mục không thành công và có lẽ khá vô dụng đối với bất kỳ người dùng nào.

Nếu bạn muốn viết một hàm đáng tin cậy in ký tự đầu tiên (không phải byte) của chuỗi Python 2, bạn có thể theo dõi ngôn ngữ bạn đang sử dụng và sau đó xem số byte thích hợp. Nhưng điều đó chắc chắn sẽ có rất nhiều vấn đề và lỗi, và nó cũng sẽ phức tạp khủng khiếp.

Giải pháp thích hợp là sử dụng "chuỗi Unicode" của Python 2. Một chuỗi unicode giống như một chuỗi python thông thường, ngoại trừ nó sử dụng các ký tự, thay vì byte. Thật vậy, chuỗi Unicode của Python 2 giống như chuỗi mặc định của Python 3. Với chuỗi Unicode, bạn có thể làm như sau:


>>> s = u'hello'
>>> len(s)
5
>>> s = u'שלום'  # Hebrew
>>> len(s)
4
>>> s = u'你好'  # Chinese
>>> len(s)
2
>>> print(s[0])


Khủng khiếp! Đó là những kết quả mong muốn. Bạn thậm chí có thể biến đây thành hành vi mặc định trong các chương trình Python 2 của bạn bằng cách sử dụng một trong những mô -đun yêu thích của tôi,

import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
6. Mô -đun
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
6 tồn tại để bạn có thể tận dụng các tính năng được lên kế hoạch để đưa vào các phiên bản sau, ngay cả khi bạn đang sử dụng phiên bản hiện có. Nó cho phép Python tung ra chức năng mới một cách từ từ và để bạn sử dụng nó bất cứ khi nào bạn sẵn sàng.

Một tính năng

import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
6 như vậy là
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
9. Điều này thay đổi loại chuỗi mặc định trong Python thành chuỗi unicode, do đó loại bỏ sự cần thiết của một "u" hàng đầu. Ví dụ:


>>> from __future__ import unicode_literals
>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
4
>>> s = '你好'  # Chinese
>>> len(s)
2
>>> print(s[0])
 

Bây giờ, điều này không có nghĩa là tất cả các vấn đề của bạn đã được giải quyết. Trước hết, câu lệnh


>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
8
>>> s = '你好'  # Chinese
>>> len(s)
6

0 này có nghĩa là các chuỗi của bạn không thực sự nữa, mà là các đối tượng của loại
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
0:


>>> type(s)


Nếu bạn có mã, và bạn không nên! Nhưng, những thứ khác cũng sẽ phá vỡ.

Đọc từ các tập tin

Ví dụ: giả sử tôi muốn đọc một tệp nhị phân, chẳng hạn như một tài liệu PDF hoặc một python JPEG. Thông thường, trong Python 2, tôi có thể làm như vậy bằng cách sử dụng chuỗi, bởi vì một chuỗi có thể chứa bất kỳ byte nào, theo bất kỳ thứ tự nào. Tuy nhiên, Unicode khá nghiêm ngặt về các byte đại diện cho các ký tự, trong phần không nhỏ vì các byte có bit thứ tám (cao nhất) hoạt động là một phần của ký tự lớn hơn và không thể tự đứng.

Đây là một chương trình ngắn mà tôi đã viết để đọc và in một tệp như vậy:


>>> filename = 'Files/unicode.txt'
>>> from __future__ import unicode_literals
>>> for one_line in open(filename):
...  for index, one_char in one_line:
...     print("{0}: {1}".format(index, one_char))

Khi tôi chạy nó, chương trình này đã sụp đổ:


Traceback (most recent call last):
  File "", line 3, in 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7
 ↪in position 0: ordinal not in range(128)

Vấn đề là gì? Chà, nó vẫn đang đọc tệp bằng cách sử dụng byte, thay vì ký tự. Sau khi đọc dòng hiện tại từ hệ thống tập tin, Python cố gắng tạo một chuỗi. Nhưng, nó không thể giải quyết xung đột giữa các byte mà nó nhận được và Unicode mà nó phải tạo như một chuỗi.

Nói cách khác, trong khi nó đã xoay sở để làm cho chuỗi của Python tuân thủ unicode, có rất nhiều điều trong môi trường Python chung không nhận thức được hoặc thân thiện.

Bạn có thể giải quyết vấn đề này bằng cách sử dụng mô -đun


>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
8
>>> s = '你好'  # Chinese
>>> len(s)
6

3 và phương thức

>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
8
>>> s = '你好'  # Chinese
>>> len(s)
6

4 mà nó cung cấp, cho biết bạn muốn sử dụng mã hóa nào khi đọc từ tệp:

>>> len("你好".encode("utf8"))
6
0

Để tóm tắt, bạn có thể thực hiện tất cả các chuỗi của Python tuân thủ unicode nếu bạn sử dụng


>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
8
>>> s = '你好'  # Chinese
>>> len(s)
6

2. Nhưng thời điểm bạn làm điều đó, bạn gặp phải vấn đề tiềm năng về việc nhận dữ liệu bằng byte từ người dùng, mạng hoặc hệ thống tập tin và gặp lỗi. Mặc dù điều này có vẻ như là một cách thực sự hấp dẫn để đối phó với toàn bộ vấn đề Unicode, tôi khuyên bạn nên đi theo con đường

>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
8
>>> s = '你好'  # Chinese
>>> len(s)
6

2 chỉ khi bạn có một bộ kiểm tra thực sự tốt và nếu bạn chắc chắn rằng tất cả các thư viện bạn sử dụng đều biết phải làm gì Khi bạn thay đổi chuỗi theo cách này. Bạn hoàn toàn có thể ngạc nhiên khi thấy rằng mặc dù nhiều thứ hoạt động tốt, nhiều người khác thì không.

Loại

import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
1

Khi nói về chuỗi và unicode, có một loại khác cũng cần được đề cập: "bytestring", còn gọi là loại

import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
1. Trong Python 2,
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
1 chỉ là một bí danh cho
>>> len("你好".encode("utf8"))
6
7, như bạn có thể thấy ở đây trong vỏ Python này chưa nhập

>>> s = 'hello'
>>> len(s)
5
>>> s = 'שלום'  # Hebrew
>>> len(s)
8
>>> s = '你好'  # Chinese
>>> len(s)
6

2:

>>> len("你好".encode("utf8"))
6
1

Nói cách khác, mặc dù các chuỗi Python thường được cho là có loại

>>> len("你好".encode("utf8"))
6
7, nhưng chúng cũng có thể được coi là có loại
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.
1. Tại sao bạn lại quan tâm? Bởi vì nó cho phép bạn tách các chuỗi sử dụng byte từ các chuỗi sử dụng Unicode đã có trong Python 2 và để tiếp tục sự khác biệt rõ ràng đó khi bạn đến Python 3.

Tôi nên nói thêm rằng một số lượng rất lớn các nhà phát triển mà tôi đã gặp (và đã dạy) sử dụng Python 2 không biết rằng các chuỗi byte thậm chí còn tồn tại. Nó phổ biến hơn nhiều khi nói về chúng trong Python 3, nơi họ phục vụ như một đối tác với các chuỗi nhận biết Unicode.

Giống như các chuỗi Unicode có tiền tố "U", bytestrings có tiền tố "B". Ví dụ:

>>> len("你好".encode("utf8"))
6
2

Trong Python 2, bạn không cần phải nói về chuỗi byte một cách rõ ràng, nhưng bằng cách sử dụng chúng, bạn có thể nói rất rõ về việc bạn đang sử dụng byte hay ký tự.

Điều này đặt ra câu hỏi làm thế nào bạn có thể chuyển từ thế giới này sang thế giới khác. Ví dụ, giả sử, bạn có chuỗi Unicode cho "Xin chào" bằng tiếng Trung, hay còn gọi là? | . Làm thế nào bạn có thể nhận được một bytestring chứa (sáu) byte? Bạn có thể sử dụng phương thức


>>> print(s[0])


4, trả về một bytestring (còn gọi là chuỗi Python 2), chứa sáu byte:

>>> len("你好".encode("utf8"))
6
3

Một cách khó hiểu (ít nhất là với tôi), bạn đã "mã hóa" từ Unicode sang byte và bạn cho biết mã hóa trong đó chuỗi đang lưu trữ mọi thứ. Bất kể, sau đó bạn nhận được:

>>> len("你好".encode("utf8"))
6
4

Bây giờ, tại sao bạn muốn biến một chuỗi unicode thành byte? Một lý do là bạn muốn viết các byte vào một tệp và bạn không muốn sử dụng


>>> print(s[0])


5 để làm như vậy. (Đừng cố viết các chuỗi Unicode vào một tệp được mở theo cách thông thường, với "mở").

Điều gì sẽ xảy ra nếu bạn muốn làm điều ngược lại, cụ thể là lấy một loạt các byte và biến chúng thành Unicode? Như bạn có thể đoán, điều ngược lại được thực hiện thông qua phương thức


>>> print(s[0])


6:

>>> len("你好".encode("utf8"))
6
5

Một lần nữa, bạn chỉ ra mã hóa nên được sử dụng và kết quả là một chuỗi unicode, mà bạn thấy ở đây được biểu thị bằng cú pháp


>>> print(s[0])


7 đặc biệt trong Python. Cú pháp này cho phép bạn chỉ định bất kỳ ký tự Unicode nào theo "điểm mã" duy nhất của nó. Nếu bạn in nó ra, bạn có thể thấy nó trông như thế nào:

>>> len("你好".encode("utf8"))
6
6

Bản tóm tắt

Python 2 sẽ không được chấp nhận vào năm 2020 và nhiều công ty đang bắt đầu xem xét cách nâng cấp. Một vấn đề lớn đối với họ sẽ là chuỗi trong các chương trình của họ. Bài viết này xem xét các chuỗi, chuỗi unicode và bytestrings trong Python 2, mở đường để bao gồm các vấn đề tương tự trong Python 3 và cách xử lý nâng cấp, trong bài viết tiếp theo của tôi.

Có bao nhiêu byte là một char?

Ứng dụng Windows 64-bit.

Có bao nhiêu bit là một nhân vật trong Python?

Một ký tự unicode trong mã hóa UTF-32 luôn luôn là 32 bit (4 byte).32 bits (4 bytes).

Có bao nhiêu ký tự là 4 byte?

Có 2.097.152 ký tự 4 byte có thể, nhưng không phải tất cả chúng đều hợp lệ và không phải tất cả các ký tự hợp lệ đều được sử dụng.Biểu đồ này cho thấy các nhóm ký tự 4 byte được chọn, bao gồm biểu tượng cảm xúc, biểu tượng và chữ tượng hình Ai Cập.2,097,152 possible 4-byte characters, but not all of them are valid and not all of the valid characters are used. This chart shows selected groups of 4-byte characters, including emojis, symbols, and Egyptian hieroglyphs.

Có bao nhiêu byte là một chuỗi?

Nhưng những gì về một chuỗi?Một chuỗi bao gồm: tiêu đề đối tượng 8 byte (đồng bộ hóa 4 byte và bộ mô tả loại 4 byte)8-byte object header (4-byte SyncBlock and a 4-byte type descriptor)