Nếu tôi hiểu rõ, có thể sử dụng cả chuỗi và chuỗi để lưu trữ văn bản UTF-8.std :: chuỗi và UTF-8 mã hóa unicode
Với char, các ký tự ASCII mất một byte duy nhất, một số ký tự Trung Quốc mất 3 hoặc 4, vv Mà có nghĩa là
str[3]
không nhất thiết chỉ với nhân vật thứ 4.Với
wchar_t
điều tương tự, nhưng số lượng tối thiểu của các byte được sử dụng cho mỗi nhân vật luôn luôn là 2 (thay vì 1 chochar
), và một nhân vật rộng 3 hoặc 4 byte sẽ mất 2wchar_t
.
Phải không?
Vì vậy, điều gì xảy ra nếu tôi muốn sử dụng string::find_first_of()
hoặc string::compare()
, v.v ... với chuỗi được mã hóa kỳ lạ như vậy? Nó có hoạt động không? Lớp chuỗi có xử lý thực tế là các ký tự có kích thước biến không? Hoặc tôi chỉ nên sử dụng chúng như là mảng byte ít tính năng giả, trong trường hợp này tôi muốn sử dụng bộ đệm wchar_t[]
.
Nếu std::string
không xử lý câu hỏi thứ hai: có thư viện cung cấp các lớp chuỗi có thể xử lý mã hóa UTF-8 đó để str[3]
thực sự trỏ đến ký tự thứ 3 (sẽ là mảng byte từ 1 đến 4)?
Lưu ý rằng ngay cả khi 'str [3]' là điểm mã thứ tư, thì đó không nhất thiết là ký tự thứ tư của người dùng. – delnan
@delnan _Ok xin lỗi (Tôi vừa chọn một bài viết ví dụ về wchar_t, Windows và UTF-16). Vì đã quá muộn để chỉnh sửa tôi đã xóa nhận xét và đây là phần không có liên kết "gây tranh cãi": _ Tôi nghĩ rằng kích thước của 'wchar_t' được xác định thực hiện, vì vậy _not_ luôn luôn là 2 byte. Hơn nữa (IIRC) Windows sử dụng nó để lưu trữ một cái gì đó như UTF-16, không phải UTF-8. Xem http://en.wikipedia.org/wiki/Wide_character –