Cách tạo chuỗi unicode với python3


98

Tôi đã sử dụng cái này:

u = unicode(text, 'utf-8')

Nhưng gặp lỗi với Python 3 (hoặc ... có thể tôi đã quên bao gồm một cái gì đó):

NameError: global name 'unicode' is not defined

Cảm ơn bạn.


17
Nếu có lý do tuyệt vời để nâng cấp lên python 3 thì theo mặc định, nó là unicode.
JBernardo

Câu trả lời:


136

Các chuỗi chữ nghĩa là unicode theo mặc định trong Python3.

Giả sử đó textlà một bytesđối tượng, chỉ cần sử dụngtext.decode('utf-8')

unicodecủa Python2 tương đương với strPython3, vì vậy bạn cũng có thể viết:

str(text, 'utf-8')

nếu bạn thích.


58
TypeError: giải mã str không được hỗ trợ
Gank

9
@Gank, Trong Python3, a strlà unicode, tức là. nó được "giải mã" vì vậy nó làm cho không có ý nghĩa để gọi decodevào nó
John La Rooy

Cùng loạiError. Hãy chỉ cần thay thế với str (txt), hoặc mã từ @magicrebirth dưới đây
Simon

3
Mẫu ban đầu không rõ ràng. Vì vậy, trong python3, nếu bạn muốn làm vậy str(text, 'utf-8'), văn bản phải là một chuỗi nhị phân. ví dụstr(b'this is a binary', 'utf-8')
killua8p

10

Có gì mới trong Python 3.0 cho biết:

Tất cả văn bản là Unicode; tuy nhiên Unicode được mã hóa được biểu thị dưới dạng dữ liệu nhị phân

Nếu bạn muốn đảm bảo rằng bạn đang xuất utf-8, đây là một ví dụ từ trang này về unicode trong 3.0 :

b'\x80abc'.decode("utf-8", "strict")

1
đây là chính xác những gì chúng ta cần cho '\ x80abc'.decode ( "utf-8", "nghiêm ngặt") trong Python 2, nhờ
workplaylifecycle

9

Như một giải pháp thay thế, tôi đã sử dụng cái này:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)

12
Tại sao bạn sử dụng một hàm lambda? Các phương pháp này được gọi là giống nhau trong mọi trường hợp. Đây là một biến thể đơn giản hơn: try: unicode = str; except: pass.
Nicolas Bouliane

1
Có vẻ như bạn chỉ có thể làm unicode = strvì nó sẽ không thất bại trong cả 2 hoặc 3
Nickolai

Hoặc from six import u as unicodecái mà tôi muốn chỉ đơn giản là vì nó tự ghi lại nhiều hơn (vì sáu là lớp tương thích 2/3) hơn làunicode = str
Nickolai

3

Đây là cách tôi giải quyết vấn đề của mình để chuyển đổi các ký tự như \ uFE0F, \ u000A, v.v. Và cả biểu tượng cảm xúc được mã hóa bằng 16 byte.

example = 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\\uD83D\\uDE0D\\uD83D\\uDE0D\\u2764\\uFE0F Present Moment Caf\\u00E8 in St.Augustine\\u2764\\uFE0F\\u2764\\uFE0F '
import codecs
new_str = codecs.unicode_escape_decode(example)[0]
print(new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\ud83d\ude0d\ud83d\ude0d❤️ Present Moment Cafè in St.Augustine❤️❤️ '
new_new_str = new_str.encode('utf-16', 'surrogatepass').decode('utf-16')
print(new_new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream😍😍❤️ Present Moment Cafè in St.Augustine❤️❤️ '

0

Trong một chương trình Python 2 mà tôi đã sử dụng trong nhiều năm, có dòng này:

ocd[i].namn=unicode(a[:b], 'utf-8')

Điều này không hoạt động trong Python 3.

Tuy nhiên, chương trình hóa ra lại hoạt động với:

ocd[i].namn=a[:b]

Tôi không nhớ tại sao tôi đặt unicode ở đó ngay từ đầu, nhưng tôi nghĩ đó là vì tên có thể chứa các chữ cái Thụy Điển åäöÅÄÖ. Nhưng ngay cả khi chúng hoạt động mà không cần "unicode".


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.