Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda menukar antara pelbagai jenis rentetan Unicode dalam C 11?

Bagaimanakah anda menukar antara pelbagai jenis rentetan Unicode dalam C 11?

Susan Sarandon
Susan Sarandonasal
2024-10-26 17:23:30466semak imbas

How do you convert between different types of Unicode strings in C  11?

Kaedah Penukaran Rentetan Unikod

Penukaran antara pelbagai jenis rentetan Unikod mungkin diperlukan dalam pelbagai senario pengaturcaraan. Walau bagaimanapun, kaedah sedia ada untuk menggunakan mbstowcs() dan wcstombs() mempunyai hadnya. Walaupun kaedah ini melakukan penukaran antara set aksara berbilangbait dan rentetan aksara lebar, kaedah ini tidak semestinya berfungsi dengan UTF-16 atau UTF-32 dan ia bergantung pada pengekodan wchar_t setempat.

Pendekatan Lebih Baik dalam C 11

C 11 memperkenalkan beberapa pilihan baharu untuk penukaran rentetan Unikod, termasuk:

1. std::wstring_convert

Kelas templat ini menyediakan antara muka yang mudah untuk menukar antara rentetan. Ia boleh digunakan dengan faset codecvt yang berbeza untuk mengendalikan pelbagai penukaran, seperti UTF-8 kepada UTF-16 atau UTF-8 kepada UTF-32:

<code class="cpp">std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
std::string utf8_string = u8"This string has UTF-8 content";
std::u16string utf16_string = convert.from_bytes(utf8_string);</code>

2. Pengkhususan Codecvt Baharu

C 11 juga memperkenalkan pengkhususan codecvt baharu yang lebih mudah digunakan:

<code class="cpp">std::codecvt_utf8_utf16<char16_t> // converts between UTF-8 and UTF-16
std::codecvt_utf8<char32_t> // converts between UTF-8 and UTF-32
std::codecvt_utf8<char16_t> // converts between UTF-8 and UCS-2</code>

Pengkhususan ini boleh digunakan dengan std::wstring_convert untuk memudahkan penukaran:

<code class="cpp">std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert16;
std::string a = convert16.to_bytes(u"This string has UTF-16 content");</code>

Nota: Visual Studio 2010 mungkin menghadapi masalah menggunakan pengkhususan ini disebabkan oleh pengehadan pengkhususan templat dengan jenis typedef. Dalam kes sedemikian, adalah disyorkan untuk mentakrifkan subkelas codecvt dengan pemusnah atau menggunakan fungsi templat std::use_facet.

3. Menukar Antara UTF-32 dan UTF-16

Memandangkan C 11 tidak menyediakan penukaran langsung antara UTF-32 dan UTF-16, anda boleh menggabungkan dua kejadian std::wstring_convert:

<code class="cpp">std::wstring_convert<std::codecvt_utf8_utf32<char32_t>, char32_t> convert32;
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert16;
std::u32string utf32_string = u"This string has UTF-32 content";
std::string utf8_string = convert32.to_bytes(utf32_string);
std::u16string utf16_string = convert16.from_bytes(utf8_string);</code>

Atas ialah kandungan terperinci Bagaimanakah anda menukar antara pelbagai jenis rentetan Unicode dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn