Xử lý Unicode trong C ++


Câu trả lời:


81
  • Sử dụng ICU để xử lý dữ liệu của bạn (hoặc một thư viện tương tự)
  • Trong kho dữ liệu của riêng bạn, hãy đảm bảo mọi thứ được lưu trữ trong cùng một bảng mã
  • Đảm bảo rằng bạn luôn sử dụng thư viện unicode của mình cho các tác vụ thông thường như độ dài chuỗi, trạng thái viết hoa, v.v. Không bao giờ sử dụng các nội dung thư viện chuẩn như is_alpha trừ khi đó là định nghĩa bạn muốn.
  • Tôi không thể nói đủ: không bao giờ lặp lại các chỉ số của a stringnếu bạn quan tâm đến tính đúng đắn, hãy luôn sử dụng thư viện unicode của bạn cho việc này.

Trừ khi bạn đang coi stringdữ liệu đó là dữ liệu nhị phân.
Demi

10

Nếu bạn không quan tâm đến khả năng tương thích ngược với các tiêu chuẩn C ++ trước đây, tiêu chuẩn C ++ 11 hiện tại đã được tích hợp hỗ trợ Unicode: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Vì vậy, phương pháp thực sự tốt nhất để xử lý Unicode trong C ++ là sử dụng các cơ sở được xây dựng sẵn cho nó. Tuy nhiên, điều đó không phải lúc nào cũng có thể xảy ra với các cơ sở mã cũ hơn, với tiêu chuẩn hiện tại rất mới.

CHỈNH SỬA: Để làm rõ, C ++ 11 nhận thức được Unicode vì nó hiện đã hỗ trợ các ký tự Unicode và chuỗi Unicode. Tuy nhiên, thư viện chuẩn chỉ hỗ trợ hạn chế cho việc xử lý và chuyển đổi Unicode. Đối với nhu cầu hiện tại của bạn, điều này có thể là đủ. Tuy nhiên, nếu bạn cần thực hiện một lượng lớn vật nặng ngay bây giờ thì bạn vẫn có thể cần sử dụng một thứ gì đó như ICU để xử lý chuyên sâu hơn. Có một số đề xuất hiện đang được thực hiện để hỗ trợ mạnh mẽ hơn cho việc chuyển đổi văn bản giữa các bảng mã khác nhau. Dự đoán của tôi (và hy vọng) là đây sẽ là một phần của báo cáo kỹ thuật tiếp theo .


Liên kết đến một tài liệu chuẩn nháp sẽ không hữu ích lắm nếu không có tham chiếu đến một phần cụ thể mô tả "hỗ trợ Unicode tích hợp sẵn" mà bạn đang thảo luận.
Ben Collins

1
@BenCollins Phần 2.14.5 "Các ký tự chuỗi" - thảo luận về các ký tự chuỗi, bao gồm các ký tự chuỗi cho các mã hóa UTF-8, UTF-16 và UTF-32. Phần 22.4.1.4 "Mẫu lớp codecvt" - thảo luận về lớp codecvt được sử dụng để chuyển đổi giữa các mã hóa ký tự (bao gồm UTF-8, UTF-16 và UTF-32). Có nhiều hơn về hỗ trợ Unicode trong tài liệu, nhưng đây dường như là những phần quan trọng nhất về chủ đề này.
eestrada

9

Công ty của chúng tôi (và các công ty khác) sử dụng nguồn mở Internation Components cho thư viện Unicode (ICU) do Taligent phát triển ban đầu.

Nó xử lý các chuỗi, ngôn ngữ, chuyển đổi, ngày / giờ, đối chiếu, chuyển đổi, et. al.

Bắt đầu với ICU Userguide


5

Đây là danh sách kiểm tra cho lập trình Windows:

  • Tất cả các chuỗi trong _T ("chuỗi của tôi")
  • Các hàm strlen () v.v. được thay thế bằng _tcslen (), v.v.
  • Sử dụng LPTSTR và LPCTSTR thay vì char * và const char *
  • Khi bắt đầu các dự án mới trong Dev Studio, hãy đảm bảo rằng tùy chọn Unicode được chọn trong thuộc tính dự án của bạn.
  • Đối với chuỗi C ++, hãy sử dụng std :: wstring thay vì std :: string

11
Không sử dụng chuỗi, ký tự và hàm "T", trừ khi bạn có ý định thực hiện cả bản dựng Unicode và ANSI. Nếu bạn chỉ có ý định làm Unicode xây dựng, chỉ cần làm thường xuyên rộng thứ nhân vật: L "chuỗi rộng của tôi" wcslen (L "chuỗi của tôi") vv
1800 INFORMATION

Đồng ý, chỉ sử dụng macro _T nếu bạn muốn văn bản chung, tức là khả năng viết mã cho cả Unicode và Ascii / MBCS.

1
Trong trường hợp bạn muốn làm cả chuỗi Unicode và ANSI cho C ++, hãy sử dụng một cái gì đó như typedef std :: basic_string <TCHAR> tString;
Serge

À vâng, tôi luôn làm #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif nhưng tôi thích cách của bạn hơn Serge.
Adam Pierce

4
Thành thật mà nói, tôi nghĩ rằng UTF16 là một sự lãng phí, để lại tất cả các mã hóa trong UTF8 sẽ đơn giản hơn và tương thích hơn với * nix.
chacham 15

3

Xem so sánh chuỗi không phân biệt chữ hoa chữ thường trong C ++

Câu hỏi đó có liên kết đến tài liệu Microsoft về Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Nếu bạn nhìn về phía điều hướng bên trái trên MSDN bên cạnh bài viết đó, bạn sẽ tìm thấy rất nhiều thông tin liên quan đến các hàm Unicode. Đây là một phần của chương về "Ký tự mã hóa" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Nó có các phần phụ sau:

  • Mô hình trang mã
  • Bộ ký tự Double-Byte trong Windows
  • Unicode
  • Vấn đề tương thích trong môi trường hỗn hợp
  • Chuyển đổi dữ liệu Unicode
  • Di chuyển các chương trình dựa trên Windows sang Unicode
  • Tóm lược

2

Mặc dù đây có thể không phải là phương pháp hay nhất cho tất cả mọi người, nhưng bạn có thể viết các quy trình C ++ UNICODE của riêng mình nếu bạn muốn!

Tôi vừa hoàn thành việc đó vào cuối tuần. Tôi đã học được rất nhiều điều, mặc dù tôi không đảm bảo rằng nó hoàn toàn không có lỗi, nhưng tôi đã thử nghiệm rất nhiều và nó có vẻ hoạt động chính xác.

Mã của tôi theo giấy phép BSD Mới và có thể tìm thấy ở đây:

http://code.google.com/p/netwidecc/downloads/list

Nó được gọi là WSUCONV và đi kèm với một chương trình main () mẫu chuyển đổi giữa UTF-8, UTF-16 và Standard ASCII. Nếu bạn vứt bỏ mã chính, bạn đã có một thư viện đẹp để đọc / ghi UNICODE.


1

Như đã nói ở trên, thư viện là lựa chọn tốt nhất khi sử dụng một hệ thống lớn. Tuy nhiên, đôi khi bạn muốn tự xử lý mọi thứ (có thể vì thư viện sẽ sử dụng nhiều tài nguyên như trên bộ điều khiển vi mô). Trong trường hợp này, bạn muốn có một thư viện đơn giản mà bạn có thể sao chép các phần của những thứ bạn thực sự cần.

Mã ví dụ của Willow Schlanger có vẻ là một mã tốt (xem câu trả lời của anh ấy để biết thêm chi tiết).

Tôi cũng tìm thấy một cái khác có mã nhỏ hơn, nhưng thiếu kiểm tra lỗi đầy đủ và chỉ xử lý UTF-8 nhưng đơn giản hơn để lấy các phần ra khỏi.

Đây là danh sách các thư viện nhúng có vẻ tốt.

Thư viện được nhúng



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.