คำนำหน้าคุณในสตริง Python คืออะไร


232

ชอบใน:

u'Hello'

ฉันเดาว่ามันระบุว่า "Unicode" ถูกต้องหรือไม่?

ถ้าเป็นเช่นนั้นตั้งแต่เมื่อใด

คำตอบ:


147

คุณถูกต้องดู3.1.3 Unicode สตริง

มันเป็นไวยากรณ์ตั้งแต่ Python 2.0

Python 3 ทำให้ซ้ำซ้อนเนื่องจากชนิดสตริงเริ่มต้นคือ Unicode เวอร์ชัน 3.0 ถึง 3.2 จะลบออก แต่จะเพิ่มใหม่ใน 3.3+เพื่อให้เข้ากันได้กับ Python 2 เพื่อช่วยในการเปลี่ยน 2 ถึง 3


6
หนึ่งควรเพิ่มว่ามันไม่จำเป็นใน Python 3 อีกต่อไป แต่ยังคงไวยากรณ์ที่ถูกต้อง
Martin Thoma

การรวมสตริง unicode + raw (regex) (เช่นur"string") นั้นใช้ได้ใน Python 2 แต่น่าเสียดายที่เป็นไวยากรณ์ที่ไม่ถูกต้องใน Python 3
cowlinator

123

U ในu'Some String'หมายความว่าสายของคุณเป็นสายอักขระ Unicode

ถาม: ฉันเป็นคนที่น่ากลัวและรีบร้อนมากและฉันมาถึงที่นี่จาก Google Search ฉันกำลังพยายามเขียนข้อมูลนี้ไปยังไฟล์ฉันได้รับข้อผิดพลาดและฉันต้องการวิธีที่ง่ายที่สุดอาจมีข้อบกพร่อง

ตอบ: คุณควรอ่านค่าสัมบูรณ์ขั้นต่ำของ Joel นักพัฒนาซอฟต์แวร์ทุกคนอย่างแน่นอนต้องรู้อย่างแน่นอนเกี่ยวกับ Unicode และชุดอักขระ (ไม่มีข้อแก้ตัว!) เรียงตามชุดอักขระ

Q: sry ไม่มีรหัสเวลากรุณา

ดี. ลองหรือstr('Some String') 'Some String'.encode('ascii', 'ignore')แต่คุณควรอ่านบางส่วนของคำตอบและการอภิปรายเกี่ยวกับการแปลงสายอักขระ Unicodeและนี้ที่ยอดเยี่ยมที่ยอดเยี่ยม, ไพรเมอร์ในการเข้ารหัสอักขระ


6
นี้ทำงานได้ถ้าสตริงมีข้อความ ASCII เท่านั้น ในกรณีอื่น ๆ คุณจะต้องเข้ารหัสอย่างชัดเจน
Martijn Pieters

2
สิ่งนี้ถือว่าคุณเป็นสิ่งที่ "กำจัด" สิ่งนี้บอกฉันว่าคุณไม่เข้าใจว่ามันคืออะไร โดยทั่วไปคุณไม่ต้องการเพียงแค่ "กำจัด" มันและวิธีที่ถูกต้องในการสร้างสตริงไบต์จากสตริง Unicode ขึ้นอยู่กับว่าสตริงนั้นมีและอยู่ในบริบทใด
Lennart Regebro

2
@ LennartRegebro เห็นด้วยอย่างยิ่ง - นี่เป็นคำตอบที่ไม่เหมาะสำหรับคนที่พูดภาษาแก้ม แต่ก็สะสมจำนวน upvotes ที่น่ากลัว แก้ไขเพื่อพยายามคัดท้ายผู้คนในทิศทางที่ถูกต้อง
แอนดรู

1
นั่นเป็นการอ่านที่สนุก! ขอบคุณ! บทความมีอายุ 17 ปีและยังมีความแม่นยำ ว้าว.
Kerwin Sneijders

52

ฉันเดาว่ามันระบุว่า "Unicode" ถูกต้องหรือไม่?

ใช่.

ถ้าเป็นเช่นนั้นตั้งแต่เมื่อใด

Python 2.x

ใน Python 3.x สตริงใช้ Unicode ตามค่าเริ่มต้นและไม่จำเป็นต้องมีuคำนำหน้า หมายเหตุ:ใน Python 3.0-3.2 คุณเป็นข้อผิดพลาดทางไวยากรณ์ ใน Python 3.3+ ถูกกฎหมายอีกครั้งเพื่อให้ง่ายต่อการเขียนแอปที่ใช้งานร่วมกันได้ 2/3


4
มันเป็นข้อผิดพลาดทางไวยากรณ์ใน Python 3 เพื่อใช้ส่วนuนำหน้า
Tim Pietzcker

14
@TimPietzcker: เฉพาะใน 3.0-3.2; ใน 3.3+ เป็นเรื่องถูกกฎหมาย (และไร้ความหมาย) เพื่อให้ง่ายต่อการเขียน 2.6 + / 3.3 + ไลบรารีและแอปรหัสฐานเดียว
abarnert

@abarnert: ดีที่ความคิดเห็นคือตอนนี้สี่และครึ่งปี :)
ทิม Pietzcker

3
@TimPietzcker: แน่นอน แต่ความคิดเห็นของคุณเป็นภาคผนวกที่มีประโยชน์สำหรับทุกคนที่ค้นหาคำตอบที่มีประโยชน์นี้โดยการค้นหาในปี 2010 ฉันคิดว่ามันมีประโยชน์ที่จะพูดถึงการเปลี่ยนแปลงใน 3.3 กับทุกคนที่พบมันในปี 2014 คำตอบ แต่ฉันคิดว่ามันเป็นประเด็นรองที่คนส่วนใหญ่จะไม่พบเจอ (เพราะถ้าคุณยังใช้ 3.0-3.2 ในปี 2014 "ไม่จำเป็นต้องมีคำนำหน้า" เป็นสิ่งที่คุณต้องรู้)
abarnert

หากคุณกำลังเขียนโค้ดเพื่อให้ผู้ใช้สามารถดาวน์โหลดและใช้งานได้ตามต้องการและต้องการครอบคลุมกรณีที่เป็นไปได้มากที่สุดโดยไม่ต้องตั้งสมมติฐานมันจะเป็นประโยชน์หากรู้ว่า 3.0-3.2 จะแตกหัก เพราะคุณจำเป็นต้องตัดสินใจว่าคุณสนใจที่จะใช้six.text_type()ทุกที่สำหรับคนที่ยังคงใช้จำนวน 3 คน (หวังว่า miniscule) [012] - อย่างน้อยข้อมูลก็อยู่ที่นั่นเพื่อให้คุณสามารถเลือก
dwanderson

3

ผมมาที่นี่เพราะผมมีตลกถ่านซินโดรมบนของrequestsเอาท์พุท ฉันคิดว่าresponse.textจะให้สายอักขระที่ถอดรหัสได้อย่างถูกต้อง แต่ในผลลัพธ์ฉันพบว่ามีตัวละครสองตัวที่ตลกที่ควรจะมี umlauts เยอรมัน

กลายresponse.encodingเป็นว่าว่างเปล่าอย่างใดและดังนั้นจึงresponseไม่ทราบวิธีการถอดรหัสเนื้อหาอย่างถูกต้องและถือว่าเป็น ASCII (ฉันเดา)

โซลูชันของฉันคือรับไบต์ดิบด้วย 'response.content' และใช้decode('utf_8')กับมันด้วยตนเอง ผลลัพธ์คือschöne Umlaute

ถอดรหัสถูกต้อง

für

เทียบกับการถอดรหัสที่ไม่เหมาะสม

fĂźr


2

สตริงทั้งหมดที่มีขึ้นสำหรับมนุษย์ควรใช้ u ""

ฉันพบว่าความคิดต่อไปนี้ช่วยได้มากเมื่อจัดการกับสตริง Python: สตริงPython รายการทั้งหมดควรใช้u""ไวยากรณ์ ""ไวยากรณ์สำหรับอาร์เรย์ไบต์เท่านั้น

ก่อนที่จะเริ่มทุบตีฉันขออธิบาย โปรแกรมไพ ธ อนส่วนใหญ่เริ่มต้นด้วยการใช้""สำหรับสตริง แต่แล้วพวกเขาจำเป็นต้องสนับสนุนเอกสารประกอบนอกอินเทอร์เน็ตดังนั้นพวกเขาจึงเริ่มใช้งาน"".decodeและในทันใดพวกเขาได้รับข้อยกเว้นทุกหนทุกแห่งเกี่ยวกับการถอดรหัสสิ่งนี้และสิ่งนั้น - ทั้งหมดเพราะการใช้""สตริง ในกรณีนี้ Unicode ทำหน้าที่เหมือนไวรัสและจะสร้างความหายนะ

แต่ถ้าคุณทำตามกฎของฉันคุณจะไม่ติดเชื้อนี้ (เพราะคุณจะติดเชื้อแล้ว)


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm

@KennyTM ฟังดูดี! u""เพียงแค่หมายถึงว่าทุกสายหมายสำหรับมนุษย์ควรใช้
Frank Krueger

1
ถ้าคุณต้องการใช้ Unicode อย่างเคร่งเครียดในทุก ๆ ที่ซึ่งสำหรับหลาย ๆ แอปพลิเคชั่น (แต่ไม่ใช่ทั้งหมด) เป็นสิ่งที่ดี - คุณต้องการ Python 3.x ไม่ใช่ 2.x ที่อาจไม่เป็นจริงในปี 2010 เมื่อสิ่งนี้ถูกเขียน แต่ในปี 2014 ห้องสมุดหรือแพลตฟอร์มส่วนใหญ่ที่ป้องกันไม่ให้คุณอัพเกรดเป็น 3.x จะป้องกันคุณจากการใช้ Unicode อย่างถูกต้อง ...
abarnert

1

มันเป็น Unicode

เพียงแค่ใส่ตัวแปรระหว่าง str()และมันจะทำงานได้ดี

แต่ในกรณีที่คุณมีสองรายการดังต่อไปนี้:

a = ['co32','co36']
b = [u'co32',u'co36']

หากคุณตรวจสอบset(a)==set(b)มันจะมาเป็นเท็จ แต่ถ้าคุณทำดังนี้

b = str(b)
set(a)==set(b)

ตอนนี้ผลลัพธ์จะเป็นจริง


อันตรายอันตราย คุณไม่ควรเข้ารหัส Unicode ( str()หรือu'€'.encode()) โดยไม่ต้องผ่านการเข้ารหัส หากสตริงมีไม่ใช่ ASCII ผู้ใช้จะได้รับ UnicodeEncodeException
Alastair McCormack

3
นอกจากนี้รหัสของคุณใช้งานไม่ได้ b = str(b)เพียงแค่ให้สตริงrepr()b = "[u'co32', u'co36']"ของรายการคือ จากนั้นset(a)==set(b) = False
Alastair McCormack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.