Antarmuka UTF-8 Portabel (Windows dan Unix) tanpa API lebar

Saya mengatur jalur ke file di harddisk menggunakan antarmuka berikut:

void setPath(const char* path);

Jalur ini akan digunakan untuk I/O file dasar.

Jika saya misalnya menyediakan jalur yang berisi karakter Cina (misalnya melalui QString::toUtf8()), ini berfungsi dengan baik untuk Unix, tetapi tentu saja tidak untuk Windows karena penggunaan internal API wchar/wstring.

Saya sekarang mencari cara elegan untuk membuat antarmuka UTF-8 ini kompatibel pada sistem berbasis Windows dan Unix. Apakah ada cara untuk menghindari API lebar pada sistem berbasis Windows dan tetap menggunakan std::string dan std::ofstream() ?

Setelah melihat boost::locale, bagi saya ini tampaknya merupakan kemungkinan untuk menangani pengkodean UTF-8. Apakah ini cara yang harus dilakukan (misalnya mengganti std::ofstream dengan boost::ofstream()?)

const std::locale loc = generator.generate(std::locale(), "zh_CN.UTF-8");
std::locale::global(loc);
std::cout.imbue(std::locale());
boost::filesystem::path::imbue(std::locale())

Semua bantuan dihargai.


person iam-tom    schedule 26.05.2015    source sumber


Jawaban (1)


Apakah ada cara untuk menghindari API lebar pada sistem berbasis Windows

Windows API tidak mendukung UTF-8, kecuali di beberapa API tertentu. Sebagian besar hanya mendukung ANSI dan UTF-16 yang bergantung pada lokal. Untuk mendukung Unicode tanpa kehilangan data, Anda harus menggunakan API berbasis UTF-16.

Antarmuka Anda perlu mengonversi string UTF-8 ke UTF-16 secara internal saat meneruskannya ke fungsi Windows API, dan mengonversi dari UTF-16 ke UTF-8 saat menerima data dari API. Tidak ada jalan lain. Ini termasuk dalam logika spesifik platform yang mendasarinya, bukan di antarmuka publik lapisan yang lebih tinggi.

dan tetap menggunakan std::string dan std::ofstream() ?

Anda dapat menggunakan std::string untuk UTF-8, dan ada banyak cara untuk mengkonversi antara std::string UTF-8 dan std::wstring UTF-16 (bahkan ada kelas di C++11 untuk mengatasinya).

Microsoft memiliki ekstensi non-standar untuk std::ifstream dan std::ofstream di Visual Studio untuk menerima nama file UTF-16. Vendor lain mungkin menyediakan atau tidak menyediakan fungsi serupa.

person Remy Lebeau    schedule 27.05.2015