mbrtowc() (Multi-Byte to Wide Character) แปลงลำดับ Multibyte Character (เช่น UTF-8) เป็น Wide Character (wchar_t) คืนค่าจำนวน Byte ที่ใช้สำหรับตัวอักษรตัวนั้น
Syntax
size_t mbrtowc(wchar_t* wc, const char* s, size_t max, mbstate_t* ps);
พารามิเตอร์
| พารามิเตอร์ | คำอธิบาย |
wc | Pointer เก็บ Wide Character ผลลัพธ์ |
s | Pointer ไปยัง Multibyte String Input |
max | จำนวน Byte สูงสุดที่ตรวจสอบใน s |
ps | Pointer ไปยัง Conversion State (mbstate_t) |
ค่าคืน
0: พบ Null Character
1..max: จำนวน Byte ที่ใช้สำหรับตัวอักษรนี้
(size_t)-1: Encoding Error (ตั้งค่า errno = EILSEQ)
(size_t)-2: Incomplete Multibyte Character (ต้องอ่านเพิ่ม)
ตัวอย่าง: แปลง UTF-8 String และแสดง Byte Count ต่อ Character
#include <bits/stdc++.h>
using namespace std;
void display(const char* s) {
mbstate_t ps = mbstate_t(); // Initial State
int s_len = strlen(s);
const char* n = s + s_len;
int len;
wchar_t wide_char;
while ((len = mbrtowc(&wide_char, s, n - s, &ps)) > 0) {
wcout << "The following " << len << " bytes are for the character "
<< wide_char << '\n';
s += len; // ขยับไปตัวถัดไป
}
}
int main() {
setlocale(LC_ALL, "en_US.utf8"); // ตั้ง Locale สำหรับ UTF-8
// UTF-8 String: 'z' (1 byte), 'Ï' (2 bytes), '簸' (3 bytes), 'क' (3 bytes)
const char* str = u8"z\u00cf\u7c38\U00000915";
display(str);
return 0;
}
ผลลัพธ์
The following 1 bytes are for the character z
The following 2 bytes are for the character Ï
The following 3 bytes are for the character 簸
The following 3 bytes are for the character क
การทำงานของ UTF-8 Encoding
| Character | Unicode Code Point | UTF-8 Bytes | Byte Count |
| z | U+007A | 0x7A | 1 |
| Ï | U+00CF | 0xC3 0x8F | 2 |
| 簸 | U+7C38 | 0xE7 0xB0 0xB8 | 3 |
| क | U+0915 | 0xE0 0xA4 0x95 | 3 |
ฟังก์ชันเกี่ยวข้อง
wcrtomb(): Wide Char → Multibyte (ทางกลับกัน)
mbsrtowcs(): Multibyte String → Wide String
wcsrtombs(): Wide String → Multibyte String
mbrlen(): ตรวจสอบความยาว Multibyte Char โดยไม่แปลง
ข้อควรระวัง
- ต้องเรียก
setlocale(LC_ALL, "") หรือ Locale ที่รองรับ UTF-8 ก่อนใช้
mbstate_t ต้อง Initialize เป็น 0 (Zero-initialize) สำหรับ String ใหม่
- Stateful: ใช้
ps เดียวกันสำหรับ String เดียวเพื่อรองรับ Stateful Encoding