2012-01-09 41 views
37

Tôi đã có mã:Cách khởi tạo và in std :: wstring?

std::string st = "SomeText"; 
... 
std::cout << st; 

và hoạt động tốt. Nhưng bây giờ nhóm của tôi muốn di chuyển đến wstring. Vì vậy, tôi đã cố gắng:

std::wstring st = "SomeText"; 
... 
std::cout << st; 

nhưng điều này đã cho tôi một lỗi biên dịch:

Error 1 error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 from 'const char [8]' to 'const std::basic_string<_Elem,_Traits,_Ax> &' D:...\TestModule1.cpp 28 1 TestModule1

Sau khi tìm kiếm trên web tôi đọc rằng tôi nên xác định nó như:

std::wstring st = L"SomeText"; // Notice the "L" 
... 
std::cout << st; 

này biên soạn nhưng in "0000000000" thay vì "SomeText".

Tôi đang làm gì sai?

+0

Cân nhắc sử dụng thư viện unicode ICU - [link] (http://icu-project.org/apiref/icu4c/index.html). Nó hỗ trợ unicode và có nhiều tính năng hữu ích. đặc biệt là nếu bạn muốn thao tác các chuỗi đó. – WeaselFox

+0

@Weasel: Tại sao trên thế giới bạn cần một thư viện riêng để làm việc với các chuỗi Unicode? –

+0

từ kinh nghiệm của tôi tốt hơn nhiều của nó để sử dụng một thư viện riêng biệt để thao tác các chuỗi wchar (tìm kiếm, thay thế vv) hoặc các chuỗi nhiều byte khác. – WeaselFox

Trả lời

65

Để hiển thị một chuỗi, bạn cũng cần phiên bản cout - wcout rộng.

std::wstring st = L"SomeText"; 
... 
std::wcout << st; 
9

Sử dụng std::wcout thay vì std::cout.

5

cố gắng sử dụng std::wcout<<st nó sẽ khắc phục được sự cố của bạn.

std::wstring st = "SomeText"; 
... 
std::wcout << st; 
2

Câu trả lời này áp dụng cho thẻ "C++/CLI" và bảng điều khiển Windows C++ có liên quan.

Nếu bạn có nhân vật đa byte trong std :: wstring, có hai điều nữa cần phải được thực hiện để làm cho nó hoạt động:

  1. Bao gồm tiêu đề
    #include <io.h>
    #include <fcntl.h>
  2. Set stdout chế độ
    _setmode(_fileno(stdout), _O_U16TEXT)

Kết quả: Multi-bytes console

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