C# sử dụng định dạng UTF16 cho chuỗi của nó.
Vì vậy, ngoài việc chuyển đổi các loại, bạn cũng nên ý thức về định dạng thực tế của chuỗi.
Khi biên dịch cho Bộ ký tự nhiều byte Visual Studio và API Win giả định UTF8 (Mã hóa cửa sổ thực tế là Windows-28591).
Khi biên dịch cho Bộ ký tự Unicode Visual studio và API Win giả định UTF16.
Vì vậy, bạn cũng phải chuyển đổi chuỗi từ định dạng UTF16 sang UTF8 và không chỉ chuyển thành chuỗi std ::.
Điều này sẽ trở nên cần thiết khi làm việc với các định dạng đa ký tự như một số ngôn ngữ không phải latin.
Ý tưởng là quyết định rằng std::wstring
luôn là đại diện cho UTF16.
Và std::string
luôn là đại diện cho UTF8.
Điều này không được thực thi bởi trình biên dịch, đó là một chính sách tốt để có.
#include "stdafx.h"
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace System;
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
//Actual format is UTF16, so represent as wstring
std::wstring utf16NativeString = context.marshal_as<std::wstring>(managedString);
//C++11 format converter
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
//convert to UTF8 and std::string
std::string utf8NativeString = convert.to_bytes(utf16NativeString);
return 0;
}
Hoặc có nó trong một cú pháp nhỏ gọn hơn:
int main(array<System::String ^> ^args)
{
System::String^ managedString = "test";
msclr::interop::marshal_context context;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
std::string utf8NativeString = convert.to_bytes(context.marshal_as<std::wstring>(managedString));
return 0;
}
Nguồn
2018-01-04 08:45:54
Những gì bạn cần để chạy? Bao gồm các tệp, v.v. ????? – alap
@alap, Sử dụng ** Hệ thống :: Thời gian chạy :: InteropServices :: Marshal ** hoặc write ** bằng cách sử dụng không gian tên System :: Runtime :: InteropServices; **. – neo