ฉันแค่คิดว่าฉันพูดถึงบางสิ่งบางอย่างที่นี่ซึ่งฉันต้องใช้เวลานานในการทดสอบก่อนที่ฉันจะรู้ว่าสิ่งที่เกิดขึ้นในที่สุด นี่อาจจะชัดเจนสำหรับทุกคนที่นี่ที่พวกเขาไม่ได้ใส่ใจพูดถึง แต่มันจะช่วยฉันได้ถ้าพวกเขามีหลักการนั้น ... !
NB: ฉันใช้Jythonโดยเฉพาะ v 2.7 ดังนั้นอาจเป็นไปได้ว่านี่อาจใช้ไม่ได้กับCPython ...
NB2: สองบรรทัดแรกของไฟล์. py ของฉันที่นี่คือ:
# -*- coding: utf-8 -*-
from __future__ import print_function
กลไกการสร้างสตริง "%" (AKA "ตัวดำเนินการแก้ไข") ทำให้เกิดปัญหาเพิ่มเติมเช่นกัน ... หากการเข้ารหัสเริ่มต้นของ "สภาพแวดล้อม" คือ ASCII และคุณพยายามทำบางสิ่งเช่นนี้
print( "bonjour, %s" % "fréd" ) # Call this "print A"
คุณจะไม่มีปัญหาในการทำงานใน Eclipse ... ในหน้าต่าง Windows CLI (ดอส DOS) คุณจะพบว่าการเข้ารหัสคือรหัสหน้า 850 (ระบบปฏิบัติการ Windows 7 ของฉัน) หรือบางสิ่งที่คล้ายกันซึ่งสามารถจัดการอักขระที่เน้นเสียงในยุโรปได้อย่างน้อย จะได้ผล
print( u"bonjour, %s" % "fréd" ) # Call this "print B"
ยังจะทำงาน
ถ้า OTOH คุณส่งไฟล์จาก CLI การเข้ารหัส stdout จะไม่มีซึ่งจะเริ่มต้นเป็น ASCII (บนระบบปฏิบัติการของฉัน) ซึ่งจะไม่สามารถจัดการกับการพิมพ์ข้างต้นอย่างใดอย่างหนึ่ง ... (การเข้ารหัสหวั่น ข้อผิดพลาด)
ดังนั้นคุณอาจคิดถึง stdout ของคุณโดยใช้
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
และลองเรียกใช้ในการบีบอัดไฟล์ CLI ไปที่ไฟล์ ... แปลกมากการพิมพ์ A ด้านบนจะใช้งานได้ ... แต่การพิมพ์ B ด้านบนจะทำให้เกิดข้อผิดพลาดในการเข้ารหัส! อย่างไรก็ตามสิ่งต่อไปนี้จะใช้งานได้:
print( u"bonjour, " + "fréd" ) # Call this "print C"
ข้อสรุปที่ฉันได้มา (ชั่วคราว) คือถ้าสตริงที่ระบุว่าเป็นสตริงUnicodeโดยใช้คำนำหน้า "u" ถูกส่งไปยังกลไก% -handling มันดูเหมือนจะเกี่ยวข้องกับการใช้การเข้ารหัสสภาพแวดล้อมเริ่มต้นโดยไม่คำนึงถึง ไม่ว่าคุณจะตั้งค่า stdout เพื่อเปลี่ยนเส้นทาง!
วิธีที่ผู้คนจัดการกับเรื่องนี้เป็นเรื่องของการเลือก ฉันยินดีต้อนรับผู้เชี่ยวชาญ Unicode ที่จะบอกว่าทำไมสิ่งนี้จึงเกิดขึ้นไม่ว่าฉันจะทำสิ่งใดผิดวิธีที่เป็นที่นิยมในการแก้ปัญหานี้ไม่ว่าจะใช้กับCPythonไม่ว่ามันจะเกิดขึ้นใน Python 3 ฯลฯ ฯลฯ