2012-06-08 3 views
6

Tôi có hiểu biết cơ bản về UTF8: các điểm mã có độ dài thay đổi, do đó, một "ký tự" có thể là 8 bit, 16 bit hoặc thậm chí lâu hơn. Những gì tôi đang tự hỏi là nếu có một số mẫu mã, thư viện, vv trong ngôn ngữ C mà những điều tương tự như một chuỗi UTF8 như thư viện chuẩn trong C. Ví dụ: nói với chiều dài của chuỗi vvXử lý UTF8 ở C

Cảm ơn,

+1

Để biết thời lượng, xem ví dụ: http://stackoverflow.com/q/5117393/440558 –

+1

Xin lưu ý rằng ví dụ: strlen() hoạt động hoàn toàn tốt trên dữ liệu được mã hóa utf-8, nó cung cấp cho bạn độ dài của chuỗi uft-8. Nó không cung cấp cho bạn số ký tự unicode trong chuỗi đó. – nos

+0

một số liên kết khác từ stackoverflow http://stackoverflow.com/questions/1031645/how-to-detect-utf-8-in-plain-c, http://stackoverflow.com/questions/4607413/c-library- chuyển đổi-unicode-code-point-to-utf8/4609989 và thành đoạn mã tôi đã viết cách đây vài tuần https://bitbucket.org/cggaertner/libtcu/raw/5ea138154ba5/utf8z.h – Christoph

Trả lời

1

Thư viện quan trọng nhất để xử lý Unicode là IBM's ICU.

Nhưng nếu tất cả các bạn cần làm là xác định số lượng codepoints trong một UTF-8 chuỗi mã hóa, đếm số lượng các ký tự với các giá trị giữa \x01\x7F hoặc giữa \xC2\xFF.

+2

'\ xC2' đến' \ xF4', thật ra - Unicode dừng tại 'U + 10FFFF'. Nó có thể dễ dàng hơn chỉ để giảm byte tiếp tục, và bạn có thể làm điều đó với một thao tác đơn lẻ: 'c & \ xC0! = \ X80'. – ecatmur

+0

Chắc chắn, hoặc giả định rằng ký tự được ký, 'C> = '\ xC2'' –

+1

Ngoài ra, Unicode còn nhiều hơn một bộ ký tự. Bạn cũng phải tính toán những thứ như _canonical equivalentence_ (nơi bạn nên xử lý một chuỗi có chứa, ví dụ, 'U + 0178' giống với một chuỗi chứa' U + 0059' 'U + 0308' mặc dù cái đầu tiên dài 2 byte trong UTF-8 và thứ hai là 3 byte). Nhưng điều đó có thể nằm ngoài phạm vi của câu hỏi này. –

4

GNU không có thư viện chuỗi Unicode, được gọi là libunistring, nhưng nó không xử lý bất cứ điều gì gần như cũng như của ICU.

Ví dụ: thư viện GNU thậm chí không cung cấp cho bạn quyền truy cập vào đối chiếu, đây là cơ sở cho tất cả so sánh chuỗi. Ngược lại, ICU làm. Một điều khác mà ICU cho rằng GNU không xuất hiện là Unicode regexes. Đối với điều đó, bạn có thể muốn sử dụng Phil Hazel’s excellent PCRE library for C, có thể được biên dịch với sự hỗ trợ UTF-8.

Tuy nhiên, có thể thư viện GNU là đủ cho những gì bạn cần. Tôi không thích API của nó nhiều. Rất bừa bộn. Nếu bạn thích lập trình C, bạn có thể thử các Go programming language, trong đó có hỗ trợ Unicode tuyệt vời. Đó là một ngôn ngữ mới, nhưng nhỏ và sạch sẽ và thú vị để sử dụng. Mặt khác, các ngôn ngữ thông dịch chính - Perl, Python và Ruby - tất cả đều có sự hỗ trợ khác nhau đối với Unicode tốt hơn bạn từng nhận được trong C. Trong số đó, hỗ trợ Unicode của Perl là phát triển nhất và mạnh mẽ.

Hãy nhớ rằng: không đủ để hỗ trợ thêm ký tự. Không có các quy tắc đi kèm với chúng, bạn không có Unicode. Tối đa, bạn có thể có ISO 10646: một tiết mục nhân vật lớn nhưng không có quy tắc. Câu thần chú của tôi là “Unicode không chỉ là nhiều nhân vật hơn; có nhiều ký tự hơn cộng với toàn bộ quy tắc để xử lý chúng. ”