Các chức năng c32rtomb
và mbrtoc32
từ <cuchar>
/<uchar.h>
được mô tả trong thư mục C Unicode TR (draft) như thực hiện chuyển đổi giữa UTF-32 và "ký tự nhiều byte".Mã hóa nào c32rtomb chuyển đổi thành?
(...) Nếu
s
không phải là một null con trỏ, cácc32rtomb
chức năng xác định số byte cần thiết để đại diện cho các ký tự multibyte tương ứng với nhân vật rộng doc32
(bao gồm bất kỳ sự thay đổi trình tự), và lưu trữ biểu diễn ký tự nhiều byte trong mảng có phần tử đầu tiên được trỏ đến bởis
. (...)
"Biểu diễn nhân vật đa byte" này là gì? Tôi thực sự quan tâm đến hành vi của các chương trình sau đây:
#include <cassert>
#include <cuchar>
#include <string>
int main() {
std::u32string u32 = U"this is a wide string";
std::string narrow = "this is a wide string";
std::string converted(1000, '\0');
char* ptr = &converted[0];
std::mbstate_t state {};
for(auto u : u32) {
ptr += std::c32rtomb(ptr, u, &state);
}
converted.resize(ptr - &converted[0]);
assert(converted == narrow);
}
là sự khẳng định trong đó đảm bảo để giữ ?
Làm việc theo giả định rằng __STDC_UTF_32__
được định nghĩa.
Câu trả lời hay. Chỉ cần được rõ ràng: Nếu anh ta thêm một cuộc gọi đến 'setlocale', xác nhận có thể thất bại, ngay cả khi các chuỗi của anh ta hoàn toàn nằm trong bộ ký tự cơ bản? – Nemo
@Nemo Nếu 'setlocale()' được gọi với một đối số khác với '" C "', vâng. Ví dụ 'setlocale (" en_US.EBCDIC ")' (giả sử đó là một miền địa phương được hỗ trợ với ý nghĩa rõ ràng) trên một hệ thống nơi mã hóa thực thi tương thích ASCII sẽ gây ra 'c32rtomb()' để tạo ra các chuỗi EBCDIC trong khi 'std :: string hẹp' sẽ vẫn được mã hóa ASCII. – bames53