ฉันต้องเห็นด้วยกับ Sascha หลักฐานพื้นฐานของTCHAR
/ _T()
/ etc. คือคุณสามารถเขียนแอปพลิเคชันที่อิง "ANSI" จากนั้นให้การสนับสนุน Unicode ได้อย่างน่าอัศจรรย์โดยการกำหนดมาโคร แต่นี่เป็นไปตามสมมติฐานที่ไม่ดีหลายประการ:
ที่คุณสร้างซอฟต์แวร์ทั้งเวอร์ชัน MBCS และ Unicode อย่างแข็งขัน
มิฉะนั้นคุณจะเพลี่ยงพล้ำและใช้char*
สตริงธรรมดาในหลาย ๆ ที่
ที่คุณไม่ใช้แบ็กสแลชที่ไม่ใช่ ASCII Escape ในตัวอักษร _T ("... ")
เว้นแต่การเข้ารหัส "ANSI" ของคุณจะเป็น ISO-8859-1 ผลลัพธ์char*
และwchar_t*
ตัวอักษรจะไม่แสดงอักขระเดียวกัน
สตริง UTF-16 นั้นใช้เหมือนกับสตริง "ANSI"
พวกเขาไม่. Unicode แนะนำแนวคิดหลายประการที่ไม่มีอยู่ในการเข้ารหัสอักขระแบบเดิมส่วนใหญ่ ตัวแทน การรวมอักขระ Normalization กฎการวางเงื่อนไขที่คำนึงถึงภาษา
และที่สำคัญที่สุดคือความจริงที่ว่า UTF-16 แทบจะไม่ถูกบันทึกลงในดิสก์หรือส่งทางอินเทอร์เน็ต: UTF-8 มีแนวโน้มที่จะเป็นที่ต้องการสำหรับการแสดงภายนอก
แอปพลิเคชันของคุณไม่ได้ใช้อินเทอร์เน็ต
(ตอนนี้นี่อาจเป็นข้อสันนิษฐานที่ถูกต้องสำหรับซอฟต์แวร์ของคุณแต่ ... )
เว็บวิ่งบน UTF-8และมากมายเหลือเฟือของการเข้ารหัสยาก TCHAR
แนวคิดเพียงตระหนักที่สอง: "ANSI" (ซึ่งไม่สามารถเป็น UTF-8 ) และ "Unicode" (UTF-16) อาจเป็นประโยชน์สำหรับการทำให้ Windows API ของคุณเรียก Unicode-Aware แต่มันก็ไร้ประโยชน์สำหรับการสร้างเว็บและแอปอีเมล Unicode-alert
ว่าคุณไม่ใช้ไลบรารีที่ไม่ใช่ของ Microsoft
TCHAR
ไม่มีใครใช้อื่น Pocoใช้std::string
และ UTF-8 SQLiteมี UTF-8 และ UTF-16 รุ่นของ API ของ TCHAR
แต่ไม่ TCHAR
ไม่ได้อยู่ในไลบรารีมาตรฐานดังนั้นอย่าเลยstd::tcout
เว้นแต่คุณต้องการกำหนดด้วยตัวเอง
สิ่งที่ฉันแนะนำแทน TCHAR
อย่าลืมว่ามีการเข้ารหัส "ANSI" ยกเว้นเมื่อคุณต้องการอ่านไฟล์ที่ไม่ใช่ UTF-8 ที่ถูกต้อง ลืมTCHAR
เหมือนกัน. เรียกฟังก์ชัน Windows API เวอร์ชัน "W" เสมอ #define _UNICODE
เพื่อให้แน่ใจว่าคุณไม่ได้เรียกใช้ฟังก์ชัน "A" โดยไม่ได้ตั้งใจ
ใช้การเข้ารหัส UTF สำหรับสตริงเสมอ: UTF-8 สำหรับchar
สตริงและ UTF-16 (บน Windows) หรือ UTF-32 (บนระบบที่เหมือน Unix) สำหรับwchar_t
สตริง typedef
UTF16
และUTF32
ประเภทอักขระเพื่อหลีกเลี่ยงความแตกต่างของแพลตฟอร์ม