ฉันควรใช้การประกาศการเข้ารหัสใน Python 3 หรือไม่


114

Python 3 ใช้การเข้ารหัส UTF-8 สำหรับไฟล์ซอร์สโค้ดตามค่าเริ่มต้น ฉันควรใช้การประกาศการเข้ารหัสที่จุดเริ่มต้นของไฟล์ต้นฉบับทุกไฟล์หรือไม่ ชอบ# -*- coding: utf-8 -*-

คำตอบ:


112

เนื่องจากค่าดีฟอลต์คือ UTF-8 คุณจึงต้องใช้การประกาศนั้นเมื่อคุณเบี่ยงเบนไปจากค่าเริ่มต้นหรือหากคุณใช้เครื่องมืออื่น ๆ (เช่น IDE หรือโปรแกรมแก้ไขข้อความ) เพื่อใช้ประโยชน์จากข้อมูลนั้น

กล่าวอีกนัยหนึ่งเท่าที่ Python เกี่ยวข้องก็ต่อเมื่อคุณต้องการใช้การเข้ารหัสที่แตกต่างออกไปคุณต้องใช้การประกาศนั้น

เครื่องมืออื่น ๆ เช่นตัวแก้ไขของคุณสามารถรองรับไวยากรณ์ที่คล้ายกันได้ซึ่งเป็นเหตุผลว่าทำไมข้อกำหนดPEP 263 จึงช่วยให้ไวยากรณ์มีความยืดหยุ่นได้มาก (ต้องเป็นข้อคิดเห็นข้อความcodingจะต้องอยู่ที่นั่นตามด้วยอักขระ:หรือ=อักขระและช่องว่างที่เป็นทางเลือก ตามด้วยตัวแปลงสัญญาณที่รู้จัก)

โปรดทราบว่าจะใช้เฉพาะกับวิธีที่ Python อ่านซอร์สโค้ดเท่านั้น ใช้ไม่ได้กับการเรียกใช้รหัสนั้นดังนั้นจึงไม่ใช่วิธีการพิมพ์การเปิดไฟล์หรือการดำเนินการ I / O อื่น ๆ ที่แปลระหว่างไบต์และ Unicode สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ Python, Unicode และการเข้ารหัสฉันขอแนะนำให้คุณอ่านPython Unicode HOWTOหรือพูดคุยPragmatic Unicodeอย่างละเอียดโดย Ned Batchelder


28
สิ่ง# -*- coding: utf-8 -*-นี้อาจยังมีประโยชน์สำหรับผู้แก้ไขบางรายในการเปลี่ยนไปใช้การเข้ารหัสที่คาดไว้เมื่อแก้ไขไฟล์ต้นฉบับ
pepr

1
@pepr เครื่องหมายคำสั่งไบต์สามารถทำได้เช่นเดียวกันไม่?
endolith

12
@endolith: UTF-8 BOM เป็นสิ่งที่น่ารังเกียจบนโลกนี้ที่ไมโครซอฟต์นำออกมา .. ดูen.wikipedia.org/wiki/Byte_order_mark#UTF-8
Martijn Pieters

1
@MartijnPieters ลิงค์ของคุณดูเหมือนจะไม่เห็นด้วยกับคุณ
endolith

2
@endolith: ไม่บทความ WP สรุปเฉพาะเบื้องหลังมันเป็นความเห็นของฉันเองว่ามันเป็นสิ่งที่น่ารังเกียจ จุดของ BOM คือการบันทึกลำดับไบต์ (ดังนั้นชื่อ Byte Order Mark) ไม่มีความสับสนของคำสั่งไบต์ใน UTF-8 แต่มีฟังก์ชันนั้นใน UTF-16 และ UTF-32 เท่านั้น ค่านี้เป็นอักขระเว้นวรรคที่ไม่มีความกว้างเป็นศูนย์ที่กำหนดซ้ำแล้วซ้ำอีก (สะดวกเนื่องจากการพิมพ์โดยไม่ตั้งใจจะลงเอยด้วยผลลัพธ์ที่มองไม่เห็นทั้งหมด) การใช้ค่านั้นใหม่เพื่อเป็นค่าคงที่เวทย์มนตร์นั้นผิดในมุมมองของฉัน
Martijn Pieters

6

ไม่ถ้า:

  • โครงการทั้งหมดใช้เฉพาะUTF-8ซึ่งเป็นค่าเริ่มต้น
  • และคุณแน่ใจว่าเครื่องมือ IDE ของคุณไม่จำเป็นต้องมีการประกาศการเข้ารหัสในแต่ละไฟล์

ใช่ถ้า

  • โครงการของคุณอาศัยการเข้ารหัสที่แตกต่างกัน
  • หรืออาศัยการเข้ารหัสจำนวนมาก

สำหรับโปรเจ็กต์การเข้ารหัสหลายรายการ:

หากไฟล์บางไฟล์ถูกเข้ารหัสในไฟล์non-utf-8แม้ว่าสำหรับการเข้ารหัสเหล่านี้UTF-8คุณควรเพิ่มการประกาศการเข้ารหัสด้วยเพราะกฎทองคือExplicit is better than implicit.

อ้างอิง:

  • PyCharm ไม่ต้องการคำประกาศนั้น:

การกำหนดค่าการเข้ารหัสสำหรับไฟล์เฉพาะใน pycharm

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