Pemrosesan Unicode di C ++

107

Apa praktik terbaik pemrosesan Unicode di C ++?

Fortepianissimo
sumber

Jawaban:

81
  • Gunakan ICU untuk menangani data Anda (atau perpustakaan serupa)
  • Di penyimpanan data Anda sendiri, pastikan semuanya disimpan dalam pengkodean yang sama
  • Pastikan Anda selalu menggunakan pustaka unicode Anda untuk tugas-tugas biasa seperti panjang string, status kapitalisasi, dll. Jangan pernah menggunakan pustaka bawaan seperti is_alphakecuali itu adalah definisi yang Anda inginkan.
  • Saya tidak bisa cukup mengatakannya: jangan pernah mengulangi indeks a stringjika Anda peduli dengan kebenaran, selalu gunakan perpustakaan unicode Anda untuk ini.
hazzen
sumber
Kecuali Anda memperlakukan stringsebagai data biner.
Demi
10

Jika Anda tidak peduli tentang kompatibilitas mundur dengan standar C ++ sebelumnya, standar C ++ 11 saat ini telah dibangun di dukungan Unicode: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Jadi praktik terbaik untuk pemrosesan Unicode di C ++ adalah menggunakan fasilitas bawaan untuk itu. Itu tidak selalu menjadi kemungkinan dengan basis kode yang lebih lama, dengan standar yang sangat baru saat ini.

EDIT: Untuk memperjelas, C ++ 11 adalah Unicode yang sekarang memiliki dukungan untuk literal Unicode dan string Unicode. Namun, pustaka standar hanya memiliki dukungan terbatas untuk pemrosesan dan konversi Unicode. Untuk kebutuhan Anda saat ini mungkin sudah cukup. Namun, jika Anda perlu melakukan banyak pekerjaan berat sekarang, Anda mungkin masih perlu menggunakan sesuatu seperti ICU untuk pemrosesan yang lebih mendalam. Ada beberapa proposal yang saat ini sedang dikerjakan untuk menyertakan dukungan yang lebih kuat untuk konversi teks di antara berbagai encoding. Dugaan saya (dan harapan) adalah bahwa ini akan menjadi bagian dari laporan teknis selanjutnya .

eestrada
sumber
Tautan itu ke draf dokumen standar tidak terlalu membantu tanpa referensi ke bagian tertentu yang menjelaskan "dukungan Unicode bawaan" yang Anda diskusikan.
Ben Collins
1
@BenCollins Bagian 2.14.5 "Literal string" - membahas literal string, termasuk literal string untuk enkode UTF-8, UTF-16 dan UTF-32. Bagian 22.4.1.4 "Class template codecvt" - membahas kelas codecvt yang digunakan untuk mengonversi antara pengkodean karakter (termasuk UTF-8, UTF-16 dan UTF-32). Ada lebih banyak tentang dukungan Unicode yang tersebar di seluruh dokumen, tetapi ini tampaknya menjadi bagian paling penting tentang subjek.
eestrada
9

Perusahaan kami (dan lainnya) menggunakan pustaka Komponen Internasional untuk Unicode (ICU) sumber terbuka yang awalnya dikembangkan oleh Taligent.

Ini menangani string, lokal, konversi, tanggal / waktu, pemeriksaan, transformasi, et. Al.

Mulailah dengan ICU Userguide

jschroedl
sumber
5

Berikut adalah daftar periksa untuk pemrograman Windows:

  • Semua string diapit _T ("string saya")
  • strlen () dll. fungsi diganti dengan _tcslen () dll.
  • Gunakan LPTSTR dan LPCTSTR sebagai ganti char * dan const char *
  • Saat memulai proyek baru di Dev Studio, pastikan opsi Unicode dipilih di properti proyek Anda.
  • Untuk string C ++, gunakan std :: wstring daripada std :: string
Adam Pierce
sumber
11
Jangan gunakan string, karakter, dan fungsi "T", kecuali Anda bermaksud melakukan build Unicode dan ANSI. Jika Anda hanya bermaksud untuk membuat Unicode build, cukup lakukan hal-hal karakter lebar biasa: L "my wide string" wcslen (L "my string") dll
1800 INFORMATION
Setuju, hanya gunakan makro _T jika Anda menginginkan teks umum, yaitu kemampuan membuat kode untuk Unicode dan Ascii / MBCS.
1
Jika Anda ingin melakukan Unicode dan ANSI untuk string C ++, gunakan sesuatu seperti typedef std :: basic_string <TCHAR> tString;
Serge
Ah ya, saya selalu melakukan #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif tapi saya suka cara Anda yang lebih baik, Serge.
Adam Pierce
4
Sejujurnya, saya pikir UTF16 adalah pemborosan, meninggalkan semua pengkodean di UTF8 lebih sederhana dan jauh lebih kompatibel dengan * nix.
chacham15
3

Lihat perbandingan string tidak sensitif huruf besar / kecil di C ++

Pertanyaan itu memiliki tautan ke dokumentasi Microsoft di Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Jika Anda melihat di sisi kiri navigasi pada MSDN di samping artikel tersebut, Anda akan menemukan banyak informasi yang berkaitan dengan fungsi Unicode. Ini adalah bagian dari bab tentang "Encoding Characters" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Ini memiliki subbagian berikut:

  • Model Halaman Kode
  • Kumpulan Karakter Double-Byte di Windows
  • Unicode
  • Masalah Kompatibilitas di Lingkungan Campuran
  • Konversi Data Unicode
  • Migrasi Program Berbasis Windows ke Unicode
  • Ringkasan
ine
sumber
2

Meskipun ini mungkin bukan praktik terbaik untuk semua orang, Anda dapat menulis rutinitas C ++ UNICODE Anda sendiri jika Anda mau!

Saya baru saja selesai melakukannya selama akhir pekan. Saya belajar banyak, meskipun saya tidak menjamin 100% bebas bug, saya melakukan banyak pengujian dan tampaknya berfungsi dengan benar.

Kode saya di bawah lisensi BSD Baru dan dapat ditemukan di sini:

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

Ini disebut WSUCONV dan dilengkapi dengan contoh program main () yang mengkonversi antara UTF-8, UTF-16, dan Standard ASCII. Jika Anda membuang kode utama, Anda memiliki perpustakaan yang bagus untuk membaca / menulis UNICODE.

Willow Schlanger
sumber
1

Seperti yang telah dikatakan di atas, perpustakaan adalah pilihan terbaik saat menggunakan sistem besar. Namun kadang-kadang Anda ingin menangani sendiri sesuatu (mungkin karena perpustakaan akan menggunakan banyak sumber daya seperti pada pengontrol mikro). Dalam hal ini Anda menginginkan perpustakaan sederhana yang Anda dapat menyalin bagian-bagiannya untuk hal-hal yang sebenarnya Anda butuhkan.

Kode contoh Willow Schlanger sepertinya bagus (lihat jawabannya untuk lebih jelasnya).

Saya juga menemukan satu sama lain yang memiliki kode lebih kecil, tetapi tidak memiliki pemeriksaan kesalahan penuh dan hanya menangani UTF-8 tetapi lebih sederhana untuk mengambil bagian darinya.

Berikut daftar pustaka tertanam yang tampaknya layak.

Perpustakaan yang disematkan

Paul Hutchinson
sumber