รหัสแหล่งที่มาของฉันควรอยู่ใน UTF-8 หรือไม่


10

ฉันรู้สึกว่าบ่อยครั้งที่คุณไม่ได้เลือกรูปแบบของรหัสของคุณฉันหมายถึงเครื่องมือส่วนใหญ่ในอดีตตัดสินใจให้ฉัน หรือฉันไม่เคยแม้แต่จะคิดเกี่ยวกับมัน ฉันใช้ TextPad บน windows เมื่อวันก่อนและเมื่อฉันบันทึกไฟล์มันจะแจ้งให้ฉันทราบเกี่ยวกับ ASCII, UTF-8/16, Unicode และอื่น ๆ ...

ฉันสมมติว่าเกือบทุกรหัสที่เขียนเป็น ASCII แต่ทำไมมันควรเป็น ASCII เราควรจะใช้ไฟล์ UTF-8 ตอนนี้สำหรับซอร์สโค้ดหรือไม่และทำไม? ฉันคิดว่านี่อาจเป็นประโยชน์กับทีมหลายภาษา มีมาตรฐานที่เกี่ยวข้องกับการตั้งชื่อตัวแปรฟังก์ชั่น / ฟังก์ชั่น ฯลฯ อย่างไร?


6
ฉันเขียนโค้ดทั้งหมดในคลิงออนคุณไม่รู้สึกตัว!

5
@JackManey: นี่ไม่ใช่ / คุณไม่รู้สึกตัว!
FrustratedWithFormsDesigner

และสคริปต์คลิงออนไม่ได้อยู่ใน Unicode ดังนั้นคุณต้องใช้อักขระ "การใช้ส่วนตัว" หรือการทับศัพท์ ASCII
dan04

@ dan04: Klingon มีการใช้งานหลอกแบบมาตรฐานของส่วนการใช้งานส่วนตัวของ BMP (ดูที่ ConScript registry ) :-)
Ross Patterson

ดูข้อโต้แย้งที่นี่: utf8everywhere.org
Rory Hunter

คำตอบ:


23

ตัวเลือกไม่ได้อยู่ระหว่าง ASCII และ UTF-8 ASCII เป็นการเข้ารหัส 7 บิตและ UTF-8 แทนที่ - ข้อความ ASCII ที่ถูกต้องใด ๆ ก็ยังถูกต้อง UTF-8 ปัญหาเกิดขึ้นเมื่อคุณใช้อักขระที่ไม่ใช่ ASCII สำหรับสิ่งเหล่านี้คุณต้องเลือกระหว่างการเข้ารหัส UTF-8, UTF-16, UTF-32 และ 8 บิต (ISO-xxxx เป็นต้น)

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

หากคุณไม่สามารถหลีกเลี่ยงอักขระที่ไม่ใช่ ASCII UTF-8 เป็นทางออกที่ดีที่สุดของคุณ ซึ่งแตกต่างจาก UTF-16 และ UTF-32 มันเป็น superset ของ ASCII ซึ่งหมายความว่าทุกคนที่เปิดมันด้วยการเข้ารหัสผิดจะได้รับสิทธิอย่างน้อยที่สุด และแตกต่างจากเพจรหัส 8 บิตมันสามารถเข้ารหัสเกี่ยวกับตัวละครทุกตัวที่คุณต้องการได้อย่างไม่น่าสงสัยและใช้ได้กับทุกระบบโดยไม่คำนึงถึงสถานที่

แล้วคุณมีการเข้ารหัสที่ประมวลผลโค้ดของคุณ สิ่งนี้ไม่จำเป็นต้องเหมือนกับการเข้ารหัสไฟล์ต้นฉบับของคุณ ตัวอย่างเช่นฉันสามารถเขียน PHP ใน UTF-8 ได้อย่างง่ายดาย แต่ตั้งค่าการเข้ารหัสหลายไบต์ภายในเป็นพูดละติน -1 เนื่องจากตัวแยกวิเคราะห์ PHP ไม่เกี่ยวข้องกับการเข้ารหัสเลย แต่อ่านลำดับไบต์เท่านั้นตัวอักษรสตริง UTF-8 ของฉันจะถูกตีความเป็นละติน -1 หากฉันส่งออกสตริงเหล่านี้บนเทอร์มินัล UTF-8 คุณจะไม่เห็นความแตกต่างใด ๆ แต่ความยาวของสตริงและการทำงานแบบมัลติไบต์อื่น ๆ (เช่นsubstr) จะให้ผลลัพธ์ที่ผิด

กฎง่ายๆของฉันคือใช้ UTF-8 สำหรับทุกสิ่ง เฉพาะในกรณีที่คุณต้องจัดการกับการเข้ารหัสอื่น ๆ ให้เปลี่ยนเป็น UTF-8 โดยเร็วที่สุดและจาก UTF-8 ให้ช้าที่สุด


6

IDEs ส่วนใหญ่จะใช้ค่าเริ่มต้นในการบันทึกด้วยการเข้ารหัส UTF-8 และคุณควรเลือก UTF-8 แทน ASCII เมื่อกำหนดตัวเลือก สิ่งนี้จะช่วยให้แน่ใจว่าคุณจะไม่พบปัญหาแปลก ๆ เกี่ยวกับรหัสสากล


2
คุณกำลังทำให้ดูเหมือนว่า ASCII กับ UTF-8 เป็นตัวเลือก เมื่อมีอักขระที่ไม่ใช่ ASCII ในไฟล์มันจะไม่ เมื่อมีอักขระ ASCII เพียงตัวเดียว UTF-8 คือ ASCII
Fred Foo

ฉันหวังว่า Eclipse จะยึดมั่นในสิ่งนี้ ในฐานะนักเรียน CS-ish ปีแรกพระเจ้าของฉันเป็นสาเหตุของอาการปวดหัวหลายอย่างเมื่อทำงานเป็นกลุ่มซึ่งมีผู้ใช้ OS X, Windows และ Linux อยู่ (สำหรับการอ้างอิงมันเริ่มต้นที่ MacRoman บน OS X, CP-1252 บน Windows และฉันลืมอันที่หนึ่งบน linux แต่คุณพนันว่ามันแตกต่างกัน)
leflings

@leflings - อาจเป็นการเข้ารหัสสภาพแวดล้อมเริ่มต้นซึ่งปัจจุบันมักเป็น UTF-8
Maciej Piechotka

1

ความสามารถในการพิมพ์ข้อความธรรมดาลงในสตริงหรืออักขระที่ยกมาในซอร์สโค้ดและความสามารถในการดูอักขระจริงนั้นดีมาก ตัวอย่างเช่นสัญลักษณ์ pi 'π' หรือ ideograph '𠀊' นั้นดีกว่าของ '\ u3c0' ที่เทียบเท่าสำหรับ pi และ L '\ u2000A' สำหรับ ideograph

เป็นไปได้ที่จะพิมพ์และ / หรือคัดลอกและวางอักขระเหล่านี้ลงในซอร์สโค้ดเช่นเดียวกับที่คุณทำกับอักขระ ASCII ในตัวแก้ไขที่เหมาะสม

ฉันพบว่าตัวอย่างที่เป็นรูปธรรมมีประโยชน์ในการสร้างแนวความคิดและทำความเข้าใจกับสิ่งต่าง ๆ ที่บางครั้งคำอธิบายคำดูเหมือนจะไม่ได้ขับรถกลับบ้าน กำหนดค่าคงที่อักขระ Unicode ที่พิมพ์ลงในซอร์สโค้ดเช่นตัวอย่างโค้ดสั้น ๆ ดังต่อไปนี้:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

อักขระตัวหนอน ASCII '~' สามารถบันทึกในไฟล์ต้นฉบับ ASCII หรือ UTF-8 ได้ แต่ตัวอักขระ Unicode ไม่สามารถจัดเก็บในรูปแบบ ASCII ได้ สัญลักษณ์ PI 'π' คือจุดโค้ด Unicode 0x3c0 และสามารถเก็บไว้ในรูปแบบ UTF-8 ในรูปแบบค่าไบต์คู่ 0xcf, 0x80 Ideographs ที่ Unicode code points 0x2000a และ 0x2893d ต้องการลำดับ UTF-8 4 ไบต์

เพื่อให้อักขระเหล่านั้นรักษาค่าที่ตั้งใจไว้และคอมไพเลอร์เพื่อแปลความหมายตามที่ต้องการซอร์สโค้ดจำเป็นต้องบันทึกในรูปแบบที่รองรับชุดอักขระ Unicode เช่น UTF-8 หรือ UTF-16 หากบันทึกเป็น UTF-8 คอมไพเลอร์ที่ดีจะเข้าใจและตีความว่าเป็นค่าที่ต้องการและตัวแก้ไขที่เหมาะสมจะโหลดและแสดงอักขระอย่างถูกต้อง

ตามที่คนอื่น ๆ ชี้ให้เห็นถ้าคุณไม่มีตัวอักษรใด ๆ ในซอร์สโค้ดของคุณที่อยู่นอกช่วง ASCII การบันทึกเป็น UTF-8 จะส่งผลให้ไฟล์ที่ไม่แตกต่างจากการบันทึกไฟล์ ASCII เนื่องจาก UTF- 8 ถูกออกแบบมาเพื่อทับซ้อน ASCII ในช่วงของอักขระ ASCII ทันทีที่คุณพิมพ์อักขระใด ๆ ลงในซอร์สโค้ดของคุณซึ่งอยู่นอกช่วง ASCII ตัวแก้ไขที่เหมาะสมจะแจ้งให้คุณทราบว่าคุณต้องเลือกการเข้ารหัสเพื่อใช้ในการบันทึกไฟล์ UTF-8 เป็นตัวเลือกที่ดีเนื่องจากสามารถรองรับ ASCII ได้เช่นเดียวกับตัวละครอื่น ๆ ที่รองรับในสภาพแวดล้อมการพัฒนาของคุณ

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