Nếu bạn đang sử dụng Windows / Visual Studio và cần chuyển đổi một chuỗi thành chuỗi, bạn có thể sử dụng:
#include <AtlBase.h>
#include <atlconv.h>
...
string s = "some string";
CA2W ca2w(s.c_str());
wstring w = ca2w;
printf("%s = %ls", s.c_str(), w.c_str());
Quy trình tương tự để chuyển đổi một chuỗi thành chuỗi (đôi khi bạn sẽ cần chỉ định một bảng mã ):
#include <AtlBase.h>
#include <atlconv.h>
...
wstring w = L"some wstring";
CW2A cw2a(w.c_str());
string s = cw2a;
printf("%s = %ls", s.c_str(), w.c_str());
Bạn có thể chỉ định một bảng mã và thậm chí UTF8 (điều đó khá hay khi làm việc với JNI / Java ). Một cách tiêu chuẩn để chuyển đổi chuỗi std :: w chuỗi thành utf8 std :: chuỗi được hiển thị trong câu trả lời này .
//
// using ATL
CA2W ca2w(str, CP_UTF8);
//
// or the standard way taken from the answer above
#include <codecvt>
#include <string>
// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str);
}
// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
Nếu bạn muốn biết thêm về tiền mã hóa, có một bài viết thú vị về Joel trên Phần mềm: Tối thiểu tuyệt đối Mỗi nhà phát triển phần mềm Tuyệt đối, Phải tích cực phải biết về Unicode và Bộ ký tự .
Các macro CA2W (Chuyển đổi Ansi thành Wide = unicode) là một phần của Macro chuyển đổi chuỗi ATL và MFC , bao gồm các mẫu.
Đôi khi bạn sẽ cần phải tắt cảnh báo bảo mật # 4995 ', tôi không biết cách giải quyết khác (với tôi nó xảy ra khi tôi biên dịch cho WindowsXp trong VS2012).
#pragma warning(push)
#pragma warning(disable: 4995)
#include <AtlBase.h>
#include <atlconv.h>
#pragma warning(pop)
Chỉnh sửa:
Vâng, theo bài viết này , bài viết của Joel dường như là: "trong khi giải trí, nó khá nhẹ về các chi tiết kỹ thuật thực tế". Bài báo: Điều mà mọi lập trình viên hoàn toàn cần, tích cực cần biết về mã hóa và bộ ký tự để làm việc với văn bản .
strings
chấp nhận các ký tự 8 bit. Có phải nó đã được mã hóa trong UTF-8?