2014-11-23 32 views
5

tôi tò mò như thế nào strlen đếm ký tự unicode nhiều byte trong C.như thế nào strlen đếm unicode trong c

Liệu nó đếm từng byte hoặc ký tự (vì chúng có thể bao gồm một số byte) cho đến khi đầu tiên ' \ 0 '?

+0

strlen hoạt động với byte. và một số ký tự unicode có '0x00' làm byte đầu tiên, vì vậy 1) strlen là vô dụng đối với các chuỗi unicode. 2) có các hàm sẵn có để làm việc với các ký tự nhiều byte: bạn có thể muốn sử dụng một trong các hàm char rộng, như _mbstrnlen() hoặc wcsnlen được định nghĩa trong string.h và wchar.h hoặc mbstring.h – user3629249

Trả lời

6

strlen() đếm số byte cho đến khi gặp phải \0. Điều này đúng cho tất cả các chuỗi.

Đối với Unicode, lưu ý rằng giá trị trả lại là strlen() có thể bị ảnh hưởng bởi byte hiện có có thể là \0 trong ký tự hợp lệ khác với ký tự kết thúc null. Nếu sử dụng UTF-8, thì không sao vì không có ký tự hợp lệ nào khác ngoài ASCII 0 có thể có một byte \0, nhưng nó có thể không đúng với các mã hóa khác.

+0

Bạn có chắc chắn không có thể là xung đột trong chuỗi unicode với ký tự \ 0? Sẽ tạo một câu hỏi mới và có liên quan! –

+4

Nó phụ thuộc vào bộ mã. Nếu bạn đang sử dụng UTF-16, thì một ký tự như U + 00FF (ÿ) sẽ bao gồm một byte rỗng và một byte 0xFF (theo một hoặc thứ tự khác, tùy thuộc vào độ dài: UTF-16LE hoặc UTF-16BE) và byte rỗng sẽ dừng 'strlen()' trong các rãnh của nó. Với UTF-32, vấn đề xảy ra với mọi ký tự Unicode vì giá trị tối đa là U + 10FFFF, có nghĩa là có ít nhất một byte bằng 0 trong mọi giá trị Unicode 4 byte có thể. UTF-8 cẩn thận tránh được vấn đề này; thời gian duy nhất một byte không hiển thị là khi ký tự là U + 0000. –

2

strlen chỉ áp dụng cho các chuỗi, đó là các mảng bị hủy bằng không là char. Tất cả các mã hóa nhiều byte được cho phép bên trong các chuỗi có thuộc tính là chúng không chứa các byte rỗng bên trong, do đó, strlen và các chức năng khác str chẳng hạn như strcat hoạt động tốt.

Nếu theo "unicode", bạn có nghĩa là các mảng wchar_t thì điều này có thể chứa byte rỗng, nhưng ở đây lại không có vấn đề gì, không có chính các thành phần wchar_t sẽ rỗng. Và bạn không nên áp dụng các hàm str cho các mảng như vậy, chúng không được định nghĩa cho chúng.

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