我正在开发基于锌的Flash应用程序的原生扩展,我需要将const char*
转换为wstring
。
这是我的代码:
mdmVariant_t* appendHexDataToFile(const zinc4CallInfo_t *pCallInfo, int paramCount, mdmVariant_t **params) {
if(paramCount >= 2) {
const char *file = mdmVariantGetString(params[0]);
const char *data = mdmVariantGetString(params[1]);
return mdmVariantNewInt(native.AppendHexDataToFile(file, data));
}
else {
return mdmVariantNewBoolean(FALSE);
}
}
但native.AppendHexDataToFile()
需要两个wstring
。
我对C ++并不是很擅长,我认为所有这些不同的字符串类型都令人困惑,我在网上找不到有用的东西。所以我问你们这是怎么做的。
编辑:字符串是UTF-8,我使用的是OSX和Windows XP / Vista / 7
答案 0 :(得分:18)
我建议您尽可能使用std::string
而不是C风格的字符串(char*
)。您可以通过简单地将std::string
对象传递给构造函数来创建const char*
对象。
获得std::string
之后,您可以创建一个简单的函数,将包含多字节UTF-8字符的std::string
转换为包含UTF-16编码点的std::wstring
(特殊的16位表示)来自std::string
)的字符。
有更多方法可以做到这一点,这是使用MultiByteToWideChar function:
的方式std::wstring s2ws(const std::string& str)
{
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo( size_needed, 0 );
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
检查这些问题:
Mapping multibyte characters to their unicode point representation
Why use MultiByteToWideCharArray to convert std::string to std::wstring?
答案 1 :(得分:14)
AFAIK仅适用于C ++ 11及以上版本:
#include <codecvt>
// ...
std::wstring stringToWstring(const std::string& t_str)
{
//setup converter
typedef std::codecvt_utf8<wchar_t> convert_type;
std::wstring_convert<convert_type, wchar_t> converter;
//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
return converter.from_bytes(t_str);
}
答案 2 :(得分:7)
您可以直接将char
字符串转换为wstring
,代码如下:
char buf1[] = "12345678901234567890";
wstring ws(&buf1[0], &buf1[20]);
答案 3 :(得分:2)
您需要一个可以编码/解码UTF8的库。不幸的是,std c ++库不包含此功能。这是您可以使用的一个库:http://utfcpp.sourceforge.net/
以下是使用它的示例:
utf8::utf8to32(bytes.begin(), bytes.end(), std::back_inserter(wstr));
答案 4 :(得分:1)
来自@anhoppe的answer的补充。转换char*
的方法如下:
#include <codecvt>
// ...
std::wstring stringToWstring(const char* utf8Bytes)
{
//setup converter
using convert_type = std::codecvt_utf8<typename std::wstring::value_type>;
std::wstring_convert<convert_type, typename std::wstring::value_type> converter;
//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
return converter.from_bytes(utf8Bytes);
}
如果您也已经知道缓冲区的长度,那么以下是转换char*
的方法:
#include <codecvt>
// ...
std::wstring stringToWstring(const char* utf8Bytes, const size_t numBytes)
{
//setup converter
using convert_type = std::codecvt_utf8<typename std::wstring::value_type>;
std::wstring_convert<convert_type, typename std::wstring::value_type> converter;
//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
return converter.from_bytes(utf8Bytes, utf8Bytes + numBytes);
}
答案 5 :(得分:0)
在OS X上,wstring使用UTF-32而不是UTF-16。您可以像这样进行转换:
#include <codecvt>
#include <string>
// make facets usable by giving them a public destructor
template <class Facet>
class usable_facet
: public Facet
{
public:
template <class ...Args>
usable_facet(Args&& ...args)
: Facet(std::forward<Args>(args)...) {}
~usable_facet() {}
};
std::wstring s2ws(std::string const &s) {
std::wstring_convert<
usable_facet<std::codecvt<char32_t,char,std::mbstate_t>>
,char32_t> convert;
std::u32string utf32 = convert.from_bytes(s);
static_assert(sizeof(wchar_t)==sizeof(char32_t),"char32_t and wchar_t must have same size");
return {begin(utf32),end(utf32)};
}
答案 6 :(得分:-1)
这是我找到的代码;
std::wstring StringToWString(const std::string& s)
{
std::wstring temp(s.length(),L' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
以下是使用Windows API函数MultiByteToWideChar的第二个解决方案的原始论坛帖子: