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(thaycout/cin). - Cần set locale:
setlocale(LC_ALL, "")hoặclocale::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àm | Mô tả | Tương đương char |
|---|---|---|
wcslen | Độ dài chuỗi rộng | strlen |
wcscat | Nối chuỗi rộng | strcat |
wcscpy | Copy chuỗi rộng | strcpy |
wcsncpy | Copy n ký tự đầu | strncpy |
wcscmp | So sánh chuỗi rộng | strcmp |
wcsstr | Tìm chuỗi con rộng | strstr |
wcstok | Tách token chuỗi rộng | strtok |
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, literalu"...",U"...",std::u16string,std::u32string. - C++20:
char8_t,std::u8stringcho 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).