2013-09-26 4 views
5

Bây giờ tôi đang cố gắng sử dụng libunistring trong chương trình c của tôi. Tôi đã xử lý chuỗi UTF-8, và cho nó tôi đã sử dụng hàm u8_strlen() từ thư viện libunistring.
Mã dụ:libunistring u8_strlen() bằng strlen()?

void print_length(uint8_t *msg) { 
    printf("Default strlen: %d\n", strlen((char *)msg)); 
    printf("U8 strlen: %d\n", u8_strlen(msg)); 
} 

Chỉ cần tưởng tượng mà chúng ta gọi print_length() với msg = "привет" (Cyrillic, utf-8 mã hóa). Tôi đã dự kiến ​​rằng strlen() phải trả về 12 (6 chữ cái * 2 byte cho mỗi chữ cái) và u8_strlen() phải trả lại 6 (chỉ 6 chữ cái).

Nhưng tôi nhận được kết quả tò mò:

Default strlen: 12 
U8 strlen: 12 

Sau này tôi đã cố gắng để tra cứu thực hiện u8_strlen, và tìm thấy mã này:

size_t 
u8_strlen (const uint8_t *s) 
{ 
    return strlen ((const char *) s); 
} 

Tôi đang tự hỏi, là nó lỗi hoặc đó là câu trả lời đúng? Nếu nó đúng, tại sao?

Trả lời

7

Tôi tin rằng đây là hành vi dự định.

The libunistring manual nói rằng:

size_t u8_strlen (const uint8_t * s)

Trả về số đơn vị trong s.

Cũng trong cuốn hướng dẫn, nó xác định điều này "đơn vị" là:

UTF-8 chuỗi, thông qua việc gõ ‘uint8_t *’. Các đơn vị là byte (uint8_t).

Tôi tin rằng lý do mà họ gán chức năng u8_strlen mặc dù nó không gì hơn là tiêu chuẩn strlen là thư viện cũng có u16_strlenu32_strlen cho các hoạt động trên UTF-16 và UTF-32 dây, tương ứng (mà sẽ đếm số lượng các đơn vị 2 byte cho đến 0x0000 và các đơn vị 4 byte cho đến 0x00000000), và chúng bao gồm u8_strlen chỉ đơn giản là để hoàn thành. Tuy nhiên

GNU gnulib không bao gồm mbslen mà có lẽ làm những gì bạn muốn:

mbslen chức năng: Xác định số lượng ký tự nhiều byte trong một chuỗi.

0

Ngoài câu trả lời của Berry, tôi lưu ý rằng tiêu chuẩn C cho phép có nhiều hơn 8 bit trong một char. Sau đó, strlen() sẽ trả về độ dài của char, chứ không phải trong khối 8 bit, do đó sẽ là một phần của số tiền trả về u8_strlen() (hoặc phải trả lại - triển khai bạn đã hiển thị rõ ràng sẽ không hoạt động và đưa ra câu trả lời giống như strlen()) .

Các vấn đề liên quan