Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencetak Aksara UTF-8 dengan Betul dalam Konsol Windows dengan Aksara Jerman?

Bagaimana untuk Mencetak Aksara UTF-8 dengan Betul dalam Konsol Windows dengan Aksara Jerman?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 17:15:021094semak imbas

How to Print UTF-8 Character Correctly in Windows Console with German Characters?

Pencetakan Aksara UTF-8 yang Betul dalam Konsol Windows

Artikel ini bertujuan untuk menangani cabaran yang dihadapi apabila cuba mencetak aksara UTF-8 dalam konsol Windows.

Penerangan Isu

Pengguna telah menghadapi kesukaran untuk memaparkan aksara Jerman menggunakan coretan kod tertentu:

<code class="c++">#include <stdio.h>
#include <windows.h>

int main() {
  SetConsoleOutputCP(CP_UTF8);
  // German characters not appearing
  char const* text = "aäbcdefghijklmnoöpqrsßtuüvwxyz";
  int len = MultiByteToWideChar(CP_UTF8, 0, text, -1, 0, 0);
  wchar_t *unicode_text = new wchar_t[len];
  MultiByteToWideChar(CP_UTF8, 0, text, -1, unicode_text, len);
  wprintf(L"%s", unicode_text);
}</code>

Walaupun menetapkan halaman kod keluaran ke UTF-8, aksara Jerman tidak dicetak dengan betul.

Penyelesaian

Untuk mencetak data Unicode dengan betul dalam konsol Windows, terdapat beberapa kaedah yang tersedia:

  1. Menggunakan WriteConsoleW Secara Terus: Berkomunikasi dengan API konsol secara eksplisit menggunakan WriteConsoleW. Pendekatan ini memastikan data ditulis dengan betul ke konsol. Walau bagaimanapun, ia memerlukan membezakan antara situasi output konsol dan bukan konsol.
  2. Menetapkan Mod Output: Tetapkan mod output deskriptor fail output standard kepada "_O_U16TEXT" atau "_O_U8TEXT" melalui _setmode. Ini membolehkan fungsi output aksara yang luas untuk mengeluarkan data Unicode dengan betul ke konsol. Ambil perhatian bahawa kaedah ini memerlukan hanya menggunakan fungsi aksara lebar pada strim yang dipilih.
  3. Pengekodan CP_UTF8: Cetak teks UTF-8 terus ke konsol dengan menetapkan halaman kod keluaran konsol kepada CP_UTF8 dan menggunakan yang sesuai fungsi peringkat rendah atau pelaksanaan ostream tersuai.

Menyelesaikan masalah

Sekiranya output yang salah dengan kaedah ketiga:

<code class="c++">putc('2'); putc('0'); // doesn't work with CP_UTF8

puts("20"); // correctly writes UTF-8 data to Windows console with CP_UTF8 </code>

Ini kerana API konsol mentafsir data yang dihantar dalam panggilan berasingan sebagai pengekodan haram apabila menggunakan CP_UTF8.

Untuk menyelesaikan masalah ini, pertimbangkan untuk mencipta subkelas streambuf yang mengendalikan penukaran aksara berbilangbait dengan tepat dan mengekalkan keadaan penukaran antara penulisan.

Atas ialah kandungan terperinci Bagaimana untuk Mencetak Aksara UTF-8 dengan Betul dalam Konsol Windows dengan Aksara Jerman?. 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