Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน mbrtowc() ใน C/C++: แปลง Multibyte เป็น Wide Character


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);

พารามิเตอร์

พารามิเตอร์คำอธิบาย
wcPointer เก็บ Wide Character ผลลัพธ์
sPointer ไปยัง Multibyte String Input
maxจำนวน Byte สูงสุดที่ตรวจสอบใน s
psPointer ไปยัง 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

CharacterUnicode Code PointUTF-8 BytesByte Count
zU+007A0x7A1
ÏU+00CF0xC3 0x8F2
簸U+7C380xE7 0xB0 0xB83
कU+09150xE0 0xA4 0x953

ฟังก์ชันเกี่ยวข้อง

  • 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