วิธีการสร้างสตริง Unicode ด้วย python3


102

ฉันใช้สิ่งนี้:

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

แต่ได้รับข้อผิดพลาดกับ Python 3 (หรือ ... บางทีฉันอาจลืมใส่บางอย่าง):

NameError: global name 'unicode' is not defined

ขอบคุณ.


17
หากมีเหตุผลที่ยอดเยี่ยมในการอัปเกรดเป็น python 3 จะเป็น Unicode ตามค่าเริ่มต้น
JBernardo

คำตอบ:


141

สตริงตัวอักษรเป็น Unicode โดยค่าเริ่มต้นใน Python3

สมมติว่าtextเป็นbytesวัตถุเพียงใช้text.decode('utf-8')

unicodeของ Python2 เทียบเท่ากับstrใน Python3 ดังนั้นคุณสามารถเขียน:

str(text, 'utf-8')

ถ้าคุณต้องการ


61
TypeError: ไม่รองรับการถอดรหัส str
Gank

10
@Gank ใน Python3 a strเป็น Unicode เช่น. มันถูก "ถอดรหัส" ดังนั้นจึงไม่มีเหตุผลที่จะเรียกdecodeมัน
John La Rooy

TypeError เดียวกัน โปรดแทนที่ด้วย str (txt) หรือรหัสจาก @magicrebirth ด้านล่าง
Simon

3
ตัวอย่างเดิมไม่ชัดเจน ดังนั้นใน python3 ถ้าคุณต้องการทำstr(text, 'utf-8')ข้อความต้องเป็นไบนารีสตริง เช่นstr(b'this is a binary', 'utf-8')
killua8p

10

มีอะไรใหม่ใน Python 3.0พูดว่า:

ข้อความทั้งหมดเป็น Unicode อย่างไรก็ตาม Unicode ที่เข้ารหัสจะแสดงเป็นข้อมูลไบนารี

หากคุณต้องการให้แน่ใจว่าคุณกำลังส่งออก utf-8 ต่อไปนี้เป็นตัวอย่างจากหน้านี้ในUnicode ใน 3.0 :

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

1
นี่คือสิ่งที่เราต้องการสำหรับ '\ x80abc'.decode ("utf-8", "เข้มงวด") ใน Python 2 ขอบคุณ
workplaylifecycle

9

เพื่อเป็นการแก้ปัญหาฉันใช้สิ่งนี้:

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

12
ทำไมคุณถึงใช้ฟังก์ชันแลมบ์ดา วิธีการเหล่านี้เรียกว่าวิธีเดียวกันไม่ว่าในกรณีใด ๆ try: unicode = str; except: passนี่คือรูปแบบที่เรียบง่าย:
Nicolas Bouliane

1
ดูเหมือนว่าคุณสามารถทำได้unicode = strเพราะมันจะไม่ล้มเหลวใน 2 หรือ 3
Nickolai

หรือfrom six import u as unicodeสิ่งที่ฉันต้องการเพียงเพราะมันเป็นเอกสารในตัวเองมากกว่า (เนื่องจากหกเป็นเลเยอร์ที่เข้ากันได้ 2/3) มากกว่าunicode = str
Nickolai

3

นี่คือวิธีที่ฉันแก้ปัญหาในการแปลงตัวอักษรเช่น \ uFE0F, \ u000A ฯลฯ และอีโมจิที่เข้ารหัสด้วย 16 ไบต์

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

ในโปรแกรม Python 2 ที่ฉันใช้มาหลายปีมีบรรทัดนี้:

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

สิ่งนี้ใช้ไม่ได้ใน Python 3

อย่างไรก็ตามโปรแกรมนี้ใช้งานได้กับ:

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

ฉันจำไม่ได้ว่าทำไมฉันถึงใส่ Unicode ไว้ในตอนแรก แต่ฉันคิดว่าเป็นเพราะชื่อสามารถมีตัวอักษรสวีเดนåäöÅÄÖ แต่ถึงแม้จะทำงานโดยไม่มี "Unicode"


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.