วิธีแปลงสตริงเป็น utf-8 ใน Python


193

ฉันมีเบราว์เซอร์ที่ส่งอักขระ utf-8 ไปยังเซิร์ฟเวอร์ Python ของฉัน แต่เมื่อฉันดึงข้อมูลจากสตริงการสืบค้นการเข้ารหัสที่ Python ส่งคืนคือ ASCII ฉันจะแปลงสตริงธรรมดาเป็น utf-8 ได้อย่างไร

หมายเหตุ: สตริงที่ส่งผ่านจากเว็บนั้นได้รับการเข้ารหัส UTF-8 แล้วฉันแค่อยากให้ Python ใช้มันเป็น UTF-8 ไม่ใช่ ASCII


ลองลิงค์นี้http://evanjones.ca/python-utf8.html
Mudassir

ฉันคิดว่าชื่อที่ดีกว่าจะเป็นวิธีการบีบบังคับสตริงให้เป็นยูนิโค้ดโดยไม่ต้องแปล?
boatcoder

1
ในปี 2018 ไพ ธ อน 3 ถ้าคุณได้รับข้อผิดพลาดในการถอดรหัส ASCII ให้ทำ"some_string".encode('utf-8').decode('utf-8')
devssh

คำตอบ:


267
>>> plain_string = "Hi!"
>>> unicode_string = u"Hi!"
>>> type(plain_string), type(unicode_string)
(<type 'str'>, <type 'unicode'>)

^ นี่คือความแตกต่างระหว่างสตริงไบต์ (plain_string) และสตริง Unicode

>>> s = "Hello!"
>>> u = unicode(s, "utf-8")

^ การแปลงเป็น Unicode และระบุการเข้ารหัส


34
ฉันได้รับข้อผิดพลาดต่อไปนี้: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteนี่คือรหัสของฉัน: ret = [] สำหรับบรรทัดใน csvReader: cline = [] สำหรับ elm ในบรรทัด: unicodestr = unicode (elm, 'utf-8') cline.app (unicodestr) ret . ผนวก (ไคลน์)
Gopakumar NG

105
สิ่งนี้ไม่ใช้ใน Python 3 สตริงทั้งหมดเป็นยูนิโค้ดและunicode()ไม่มีอยู่
Noumenon

ชนิดนี้ชน แต่ขอบคุณ สิ่งนี้แก้ไขปัญหาที่ฉันพยายามพิมพ์ Unicode และได้รับของ
智障的人

คุณแปลงuกลับเป็นstrรูปแบบอย่างไร (แปลงuกลับเป็นs)
Tanguy

3
รหัสนี้จะทำงานได้ตราบใดที่ข้อความไม่ได้มีอักขระที่ไม่ใช่ ASCII อักขระที่เน้นเสียงอย่างง่ายบนสตริงจะทำให้มันล้มเหลว
Haroldo_OK

71

หากวิธีการด้านบนใช้ไม่ได้ผลคุณสามารถบอก Python ให้ละเว้นส่วนของสตริงที่ไม่สามารถแปลงเป็น utf-8 ได้:

stringnamehere.decode('utf-8', 'ignore')

6
มี AttributeError: วัตถุ 'str' ไม่มีแอตทริบิวต์ 'decode'
saran3h

2
@ saran3h ดูเหมือนว่าคุณกำลังใช้ Python 3 ซึ่งในกรณีนี้ Python ควรจัดการกับปัญหาการเข้ารหัสสำหรับคุณ คุณลองอ่านเอกสารโดยไม่ระบุการเข้ารหัสหรือไม่?
duhaime

Python โดยค่าเริ่มต้นเลือกการเข้ารหัสระบบ ใน windows 10 เป็น cp1252 ซึ่งแตกต่างจาก utf-8 ฉันเสียเวลาไปกับการใช้ codecs.open () ใน py 3.8
Vishesh Mangla

21

อาจเป็น overkill เล็กน้อย แต่เมื่อฉันทำงานกับ ascii และ unicode ในไฟล์เดียวกันการถอดรหัสซ้ำอาจเป็นความเจ็บปวดนี่คือสิ่งที่ฉันใช้:

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
    return input

15

การเพิ่มบรรทัดต่อไปนี้ที่ด้านบนของไฟล์. py ของคุณ:

# -*- coding: utf-8 -*-

อนุญาตให้คุณเข้ารหัสสตริงโดยตรงในสคริปต์ของคุณเช่นนี้

utfstr = "ボールト"

1
มันไม่ใช่สิ่งที่ OP ถาม แต่หลีกเลี่ยงตัวอักษรสตริงดังกล่าวอยู่ดี มันสร้างสายอักขระ Unicode ใน Python 3 (ดี) แต่เป็นการทดสอบใน Python 2 (ไม่ดี) เพิ่มfrom __future__ import unicode_literalsที่ด้านบนสุดหรือใช้ส่วนu''นำหน้า อย่าใช้อักขระที่ไม่ใช่ ascii เป็นตัวbytesอักษร หากต้องการรับ utf-8 ไบต์คุณสามารถทำได้ในutf8bytes = unicode_text.encode('utf-8')ภายหลังหากจำเป็น
jfs

1
@jfs จะ from __future__ import unicode_literalsช่วยให้ฉันแปลงสตริงด้วยอักขระที่ไม่ใช่ ASCII เป็น utf-8 ได้อย่างไร
Ortal Turgeman

@OttalTurgeman ฉันไม่ได้ตอบคำถาม ดูมันเป็นความคิดเห็นไม่ใช่คำตอบ ความคิดเห็นของฉันแก้ไขปัญหาเกี่ยวกับรหัสในคำตอบ มันพยายามที่จะสร้าง bytestring กับตัวละครที่ไม่ใช่ ASCII ใน Python 2 (มันเป็น SyntaxError ใน Python 3 - ตัวอักษรไบต์ห้ามที่)
jfs

13

ถ้าฉันเข้าใจคุณอย่างถูกต้องคุณมีสตริง utf-8 ที่เข้ารหัสในรหัสของคุณ

การแปลงสตริงไบต์เป็นสตริงยูนิโค้ดเรียกว่าการถอดรหัส (unicode -> ไบต์เข้ารหัสคือการเข้ารหัส)

คุณทำได้โดยใช้ฟังก์ชันunicodeหรือวิธีการถอดรหัส ทั้ง:

unicodestr = unicode(bytestr, encoding)
unicodestr = unicode(bytestr, "utf-8")

หรือ:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")


8

ใน Python 3.6 พวกเขาไม่มีเมธอด unicode () ในตัว สตริงจะถูกเก็บไว้เป็นยูนิโค้ดตามค่าเริ่มต้นและไม่จำเป็นต้องทำการแปลง ตัวอย่าง:

my_str = "\u221a25"
print(my_str)
>>> 25

3

แปลด้วย ord () และ unichar () ถ่าน Unicode ทุกตัวมีหมายเลขที่เกี่ยวข้องกันบางอย่างเช่นดัชนี Python มีวิธีการสองสามวิธีในการแปลระหว่างอักขระและหมายเลขของเขา ข้อเสียคือตัวอย่าง - หวังว่ามันจะช่วยได้

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ

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