การประมวลผล Unicode ใน C ++


คำตอบ:


81
  • ใช้ ICUเพื่อจัดการกับข้อมูลของคุณ (หรือไลบรารีที่คล้ายกัน)
  • ในที่เก็บข้อมูลของคุณเองตรวจสอบให้แน่ใจว่าทุกอย่างถูกจัดเก็บในการเข้ารหัสเดียวกัน
  • ตรวจสอบให้แน่ใจว่าคุณใช้ไลบรารี Unicode สำหรับงานทางโลกอยู่เสมอเช่นความยาวสตริงสถานะการใช้อักษรตัวพิมพ์ใหญ่ ฯลฯ อย่าใช้ไลบรารีมาตรฐานในตัวเช่นis_alphaเว้นแต่จะเป็นคำจำกัดความที่คุณต้องการ
  • ฉันไม่สามารถพูดได้เพียงพอ: อย่าวนซ้ำดัชนีของstringถ้าคุณสนใจเกี่ยวกับความถูกต้องให้ใช้ไลบรารี Unicode ของคุณสำหรับสิ่งนี้เสมอ

เว้นเสียแต่ว่าคุณจะถือว่าstringเป็นข้อมูลไบนารี
Demi

10

หากคุณไม่สนใจเกี่ยวกับความเข้ากันได้ย้อนหลังกับมาตรฐาน C ++ ก่อนหน้ามาตรฐาน C ++ 11 ในปัจจุบันได้สร้างขึ้นในการรองรับ Unicode: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

ดังนั้นแนวทางปฏิบัติที่ดีที่สุดสำหรับการประมวลผล Unicode ใน C ++ คือการใช้สิ่งอำนวยความสะดวกในตัว นั่นไม่ได้เป็นไปได้เสมอไปสำหรับฐานรหัสรุ่นเก่า แต่ด้วยมาตรฐานเป็นสิ่งใหม่ในปัจจุบัน

แก้ไข: เพื่อความชัดเจน C ++ 11 คือ Unicode ทราบว่าขณะนี้มีการรองรับตัวอักษร Unicode และสตริง Unicode แล้ว อย่างไรก็ตามไลบรารีมาตรฐานมีการสนับสนุนที่ จำกัดสำหรับการประมวลผลและการแปลง Unicode เท่านั้น สำหรับความต้องการในปัจจุบันของคุณอาจเพียงพอแล้ว อย่างไรก็ตามหากคุณจำเป็นต้องทำการยกของหนักจำนวนมากในตอนนี้คุณอาจต้องใช้ICUเพื่อประมวลผลในเชิงลึกมากขึ้น ขณะนี้มีข้อเสนอบางอย่างในการทำงานเพื่อรวมการสนับสนุนที่มีประสิทธิภาพมากขึ้นสำหรับการแปลงข้อความระหว่างการเข้ารหัสต่างๆ ฉันเดา (และหวังว่า) เป็นที่ว่านี้จะเป็นส่วนหนึ่งของถัดไปรายงานทางเทคนิค


ลิงก์ไปยังเอกสารมาตรฐานฉบับร่างจะไม่เป็นประโยชน์หากไม่มีการอ้างอิงถึงส่วนใดส่วนหนึ่งที่อธิบายถึง "การสนับสนุน Unicode ในตัว" ที่คุณกำลังพูดถึง
Ben Collins

1
@BenCollins Section 2.14.5 "String literals" - กล่าวถึงสตริงลิเทอรัล รวมถึงสตริงลิเทอรัลสำหรับการเข้ารหัส UTF-8, UTF-16 และ UTF-32 ส่วน 22.4.1.4 "ตัวแปลงรหัสเทมเพลตคลาส" - กล่าวถึงคลาส codecvt ที่ใช้สำหรับการแปลงระหว่างการเข้ารหัสอักขระ (รวมถึง UTF-8, UTF-16 และ UTF-32) มีข้อมูลเพิ่มเติมเกี่ยวกับการสนับสนุน Unicode อยู่ทั่วทั้งเอกสาร แต่สิ่งเหล่านี้ดูเหมือนจะเป็นส่วนที่สำคัญที่สุดในหัวข้อนี้
eestrada

9

บริษัท ของเรา (และอื่น ๆ ) ใช้ไลบรารีInternation Components สำหรับ Unicode (ICU) แบบโอเพนซอร์สที่พัฒนาโดย Taligent

จัดการกับสตริงสถานที่การแปลงวันที่ / เวลาการเรียงลำดับการแปลงและอื่น ๆ อัล

เริ่มต้นด้วย ICU Userguide


5

นี่คือรายการตรวจสอบสำหรับการเขียนโปรแกรม Windows:

  • สตริงทั้งหมดที่อยู่ใน _T ("สตริงของฉัน")
  • strlen () ฯลฯ ฟังก์ชันแทนที่ด้วย _tcslen () เป็นต้น
  • ใช้ LPTSTR และ LPCTSTR แทน char * และ const char *
  • เมื่อเริ่มโครงการใหม่ใน Dev Studio ตรวจสอบให้แน่ใจว่าได้เลือกตัวเลือก Unicode ในคุณสมบัติโครงการของคุณอย่างเคร่งครัด
  • สำหรับสตริง C ++ ให้ใช้ std :: wstring แทน std :: string

11
อย่าใช้สตริงอักขระและฟังก์ชัน "T" เว้นแต่คุณตั้งใจจะสร้างทั้ง Unicode และ ANSI หากคุณตั้งใจจะสร้าง Unicode เพียงแค่ใช้อักขระแบบกว้างปกติ: L "my wide string" wcslen (L "my string") เป็นต้น
1800 ข้อมูล

ตกลงใช้มาโคร _T เท่านั้นหากคุณต้องการข้อความทั่วไปเช่นความสามารถในการเขียนโค้ดสำหรับทั้ง Unicode และ Ascii / MBCS

1
ในกรณีที่คุณต้องการทำทั้ง Unicode และ ANSI สำหรับสตริง C ++ ให้ใช้บางอย่างเช่น typedef std :: basic_string <TCHAR> tString;
เสิร์จ

ใช่ฉันมักจะทำ #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif แต่ฉันชอบวิธีของคุณที่ดีกว่า Serge
Adam Pierce

4
จริงๆแล้วฉันคิดว่า UTF16 นั้นสิ้นเปลืองการทิ้งการเข้ารหัสทั้งหมดใน UTF8 นั้นง่ายกว่าและเข้ากันได้กับ * nix มากกว่า
chacham15

3

ดู การเปรียบเทียบสตริงที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ใน C ++

คำถามนั้นมีลิงก์ไปยังเอกสารของ Microsoft เกี่ยวกับ Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

หากคุณดูทางด้านซ้ายมือของการนำทางของ MSDN ถัดจากบทความนั้นคุณจะพบข้อมูลมากมายเกี่ยวกับฟังก์ชัน Unicode เป็นส่วนหนึ่งของบท "Encoding Characters" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

มีส่วนย่อยดังต่อไปนี้:

  • โมเดลโค้ดเพจ
  • Double-Byte Character Sets ใน Windows
  • Unicode
  • ปัญหาความเข้ากันได้ในสภาพแวดล้อมแบบผสม
  • การแปลงข้อมูล Unicode
  • การโอนย้ายโปรแกรมที่ใช้ Windows ไปยัง Unicode
  • สรุป

2

แม้ว่านี่อาจไม่ใช่แนวทางปฏิบัติที่ดีที่สุดสำหรับทุกคน แต่คุณสามารถเขียนกิจวัตร C ++ UNICODE ของคุณเองได้หากต้องการ!

ฉันเพิ่งทำเสร็จในช่วงสุดสัปดาห์ ฉันได้เรียนรู้มากมายแม้ว่าฉันจะไม่รับประกันว่ามันไม่มีบั๊ก 100% แต่ฉันได้ทำการทดสอบหลายครั้งและดูเหมือนว่าจะทำงานได้อย่างถูกต้อง

รหัสของฉันอยู่ภายใต้ใบอนุญาต BSD ใหม่และสามารถพบได้ที่นี่:

http://code.google.com/p/netwidecc/downloads/list

เรียกว่า WSUCONV และมาพร้อมกับโปรแกรม main () ตัวอย่างที่แปลงระหว่าง UTF-8, UTF-16 และ Standard ASCII หากคุณทิ้งรหัสหลักไปคุณจะมีห้องสมุดที่ดีสำหรับการอ่าน / เขียน UNICODE


1

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

รหัสตัวอย่างของ Willow Schlanger ดูเหมือนจะดี (ดูคำตอบของเขาสำหรับรายละเอียดเพิ่มเติม)

ฉันยังพบอีกอันที่มีรหัสเล็กกว่า แต่ขาดการตรวจสอบข้อผิดพลาดทั้งหมดและจัดการเฉพาะ UTF-8 แต่ง่ายกว่าที่จะนำบางส่วนออก

นี่คือรายการของไลบรารีแบบฝังที่ดูดี

ไลบรารีแบบฝัง



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