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

ฟังก์ชัน mbrlen() ใน C/C++: หาความยาว Multibyte Character

ฟังก์ชัน mbrlen() ใช้หาความยาว (ในหน่วย Bytes) ของ Multibyte Character หนึ่งตัว จาก Multibyte String ใช้สำหรับการประมวลผล Unicode/UTF-8 และ Multibyte Encodings อื่นๆ อยู่ใน Header <wchar.h>

ไวยากรณ์

#include <wchar.h>
size_t mbrlen(const char *s, size_t n, mbstate_t *ps);
  • s - Pointer ไปยัง Byte แรกของ Multibyte Character
  • n - จำนวน Bytes สูงสุดที่จะตรวจสอบ
  • ps - Pointer ไปยัง mbstate_t Object (Conversion State) - ใช้สำหรับ Stateful Encodings
  • คืนค่า: จำนวน Bytes ของ Character, 0 (Null Character), (size_t)-1 (Encoding Error), (size_t)-2 (Incomplete Character)

ตัวอย่าง

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

int main(void) {
    char a[] = "s";          // ASCII 's' = 1 byte
    mbstate_t state = {0};   // Initialize State
    int len;
    
    len = mbrlen(a, 5, &state);
    printf("Length of multibyte character: %d\n", len);
    
    // ทดสอบกับ UTF-8 Multibyte
    char utf8[] = u8"日本語";  // UTF-8 String
    mbstate_t state2 = {0};
    
    for (int i = 0; utf8[i] != '\0'; ) {
        size_t clen = mbrlen(&utf8[i], 4, &state2);
        if (clen == (size_t)-1 || clen == (size_t)-2) break;
        printf("Char at %d: %zu bytes\n", i, clen);
        i += clen;
    }
    
    return 0;
}

ผลลัพธ์

Length of multibyte character: 1
Char at 0: 3 bytes
Char at 3: 3 bytes
Char at 6: 3 bytes

ค่าที่คืน (Return Values)

Return Valueความหมาย
0Null Character (U+0000)
1..nจำนวน Bytes ของ Character ที่สมบูรณ์
(size_t)-1Encoding Error (Invalid Sequence) - errno = EILSEQ
(size_t)-2Incomplete Character (ต้องการ Bytes เพิ่ม) - ต้องอ่านต่อ

ความสำคัญของ mbstate_t

บาง Encoding เป็น Stateful (เช่น Shift-JIS, ISO-2022-JP) ต้องการ State ระหว่างการแปลง

mbstate_t state = {0};  // Reset State ก่อนใช้งานใหม่
size_t len = mbrlen(ptr, remaining, &state);

ฟังก์ชันเกี่ยวข้อง (Multibyte Handling)

ฟังก์ชันHeaderคำอธิบาย
mbrlen()wchar.hความยาว Multibyte Char (Bytes)
mbrtowc()wchar.hMultibyte → Wide Char (wchar_t)
wcrtomb()wchar.hWide Char → Multibyte
mbsrtowcs()wchar.hMultibyte String → Wide String
wcsrtombs()wchar.hWide String → Multibyte String
mblen()stdlib.hLegacy Version (Not Thread-safe)

UTF-8 Byte Patterns

ASCII (U+0000..U+007F):     0xxxxxxx                    (1 byte)
Latin-1 (U+0080..U+07FF):   110xxxxx 10xxxxxx           (2 bytes)
BMP (U+0800..U+FFFF):       1110xxxx 10xxxxxx 10xxxxxx  (3 bytes)
Supplementary (U+10000+):   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (4 bytes)

Best Practices

  • ใช้ mbrlen() แทน mblen() (Thread-safe, Stateful)
  • Initialize mbstate_t = {0} ก่อนใช้งานใหม่
  • ตรวจสอบ Return Values: -1 (Error), -2 (Incomplete)
  • ใน C++ ใช้ std::codecvt (Deprecated C++17) หรือ std::wstring_convert (Removed C++20) หรือ Libraries เช่น ICU, iconv
  • C++20: std::from_chars, std::to_chars สำหรับ Numbers, std::text_encoding (Proposed)