2012-12-19 29 views
5

Tôi gặp sự cố với chuỗi char nhiều byte. Tôi đã đơn giản hóa vấn đề của tôi như sau:xuất chuỗi multibyte trong C++

std::wstring str = L"multıbyte test string"; 
std::wofstream f; 
f.open("F:\\dump.txt"); 
f << str; 
f.close(); 

và nội dung các tập tin dump là: "mult"

Tại sao nó cắt phần còn lại của str mặc dù tôi đã sử dụng wstring và wofstream?

Cảm ơn

+1

Một số câu hỏi: Hệ điều hành của bạn có tệp kết xuất lớn đến mức nào? Bạn đã kiểm tra nội dung của tệp kết xuất như thế nào? –

+0

Nhân vật 'ı' trong 'multibyte' có gây ra vấn đề gì không? – iikkoo

Trả lời

1

wofstream ghi dữ liệu bằng ngôn ngữ hiện tại. Ngôn ngữ mặc định có thể không hỗ trợ các ký tự nhiều byte.

Xem câu hỏi: Unable to write a std::wstring into wofstream

Bạn có thể làm cho nó ra chuỗi đầy đủ theo:

std::locale::global(std::locale("")); 

trước khi viết, tuy nhiên bạn sẽ không nhận được những nhân vật như unicode trên cửa sổ, vì nó doesn' t hỗ trợ UTF-8 địa phương nguyên bản.

Để làm điều đó, bạn nên chuyển đổi nó thành chuỗi tiêu đề :: bằng cách sử dụng WideCharToMultiByte và viết bằng cách sử dụng thường xuyên ofstream.

0

Bạn sẽ phải truyền luồng đầu ra với một số ngôn ngữ để nhận được một số khía cạnh hợp lý codecvt để thực hiện chuyển đổi wchar_t sang char. Nếu bạn có C++ 11 hỗ trợ trình biên dịch hoặc Visual Studio 2010 và sau đó, bạn có thể sử dụng UTF-8 khía cạnh (codecvt_utf8):

f.imbue(
    std::locale (  // using std::locale constructed from 
     std::locale(), // global locale 
          // and codecvt_utf8 facet 
      new std::codecvt_utf8<char, 0x10FFFF, 
       static_cast<std::codecvt_mode>(std::consume_header 
        | std::little_endian)>); 

Ngoài ra còn có codecvt_utf16.

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