ฟังก์ชัน 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 Charactern- จำนวน Bytes สูงสุดที่จะตรวจสอบps- Pointer ไปยังmbstate_tObject (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 | ความหมาย |
|---|---|
0 | Null Character (U+0000) |
1..n | จำนวน Bytes ของ Character ที่สมบูรณ์ |
(size_t)-1 | Encoding Error (Invalid Sequence) - errno = EILSEQ |
(size_t)-2 | Incomplete 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.h | Multibyte → Wide Char (wchar_t) |
wcrtomb() | wchar.h | Wide Char → Multibyte |
mbsrtowcs() | wchar.h | Multibyte String → Wide String |
wcsrtombs() | wchar.h | Wide String → Multibyte String |
mblen() | stdlib.h | Legacy 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)