Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Ký tự rộng (Wide char) và hàm thư viện trong C++

Ký tự rộng (wide character) – kiểu wchar_t – chiếm 2 byte (thường) hoặc 4 byte (tùy compiler/platform), đủ chứa Unicode (UTF-16 hoặc UTF-32). Khác với char 1 byte chỉ cover ASCII/mã trang.

Khai báo & In

  • Literal: tiền tố L – L'a', L"hello".
  • In/đọc: dùng wcout, wcin (thay cout/cin).
  • Cần set locale: setlocale(LC_ALL, "") hoặc locale::global(locale("")) để hiển thị Unicode đúng.
#include <iostream>
#include <clocale>
using namespace std;

int main() {
    setlocale(LC_ALL, ""); // quan trọng cho Unicode
    wchar_t wc = L'a';
    wcout << L"The wide character is: " << wc << endl;
    wcout << L"Wide character size: " << sizeof(wc) << endl; // 2 hoặc 4

    wchar_t str[] = L"Hello 世界";
    wcout << str << endl;
    return 0;
}

Các hàm xử lý chuỗi rộng (tương ứng <cwchar>)

HàmMô tảTương đương char
wcslenĐộ dài chuỗi rộngstrlen
wcscatNối chuỗi rộngstrcat
wcscpyCopy chuỗi rộngstrcpy
wcsncpyCopy n ký tự đầustrncpy
wcscmpSo sánh chuỗi rộngstrcmp
wcsstrTìm chuỗi con rộngstrstr
wcstokTách token chuỗi rộngstrtok

Ví dụ dùng hàm

#include <iostream>
#include <cwchar>
#include <clocale>
using namespace std;

int main() {
    setlocale(LC_ALL, "");
    wchar_t s1[50] = L"Hello";
    wchar_t s2[] = L" World";

    wcscat(s1, s2);
    wcout << L"After wcscat: " << s1 << endl;

    wcout << L"Length: " << wcslen(s1) << endl;
    wcout << L"Compare: " << wcscmp(s1, L"Hello World") << endl; // 0 nếu bằng

    wchar_t *p = wcsstr(s1, L"World");
    if (p) wcout << L"Found at offset: " << (p - s1) << endl;

    return 0;
}

Unicode & C++ hiện đại

  • C++11: char16_t, char32_t, literal u"...", U"...", std::u16string, std::u32string.
  • C++20: char8_t, std::u8string cho UTF-8.
  • Thư viện <codecvt> (deprecated C++17) hoặc ICU, iconv để chuyển đổi encoding.
  • Ưu tiên lưu trữ UTF-8 trong std::string (byte), chỉ dùng wide khi cần API OS (Windows API dùng UTF-16).