问题是如何将wstring转换为字符串?
我有下一个例子:
#include <string>
#include <iostream>
int main()
{
std::wstring ws = L"Hello";
std::string s( ws.begin(), ws.end() );
//std::cout <<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::cout <<"std::string = "<<s<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
注释掉的输出是:
std::string = Hello
std::wstring = Hello
std::string = Hello
Run Code Online (Sandbox Code Playgroud)
但不仅仅是:
std::wstring = Hello
Run Code Online (Sandbox Code Playgroud)
这个例子有什么不对吗?我可以像上面那样进行转换吗?
编辑
新的例子(考虑到一些答案)是
#include <string>
#include <iostream>
#include <sstream>
#include <locale>
int main()
{
setlocale(LC_CTYPE, "");
const std::wstring ws = L"Hello";
const std::string s( ws.begin(), ws.end() );
std::cout<<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::stringstream ss;
ss …Run Code Online (Sandbox Code Playgroud) 我读过并听说C++ 11支持Unicode.关于这一点的一些问题:
std::string做自己应该?我正在寻找一种方法,或用于将std :: string转换为LPCWSTR的代码片段
我正在寻找一种方法将一些数据填充到DLL边界的字符串中.因为我们使用不同的编译器,所有的dll接口都是简单的char*.
是否有正确的方法将指针传递给dll函数,以便它能够直接填充字符串缓冲区?
string stringToFillIn(100, '\0');
FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() ); // definitely WRONG!
FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() ); // WRONG?
FunctionInDLL( &stringToFillIn[0], stringToFillIn.size() ); // WRONG?
stringToFillIn.resize( strlen( stringToFillIn.c_str() ) );
Run Code Online (Sandbox Code Playgroud)
看起来最有希望的是&stringToFillIn [0]但是这是一个正确的方法,假设你认为string :: data()==&string [0]?这似乎不一致.
或者最好是吞下额外的分配并避免问题:
vector<char> vectorToFillIn(100);
FunctionInDLL( &vectorToFillIn[0], vectorToFillIn.size() );
string dllGaveUs( &vectorToFillIn[0] );
Run Code Online (Sandbox Code Playgroud) 如何将TCHAR数组转换为std::string(不是std::basic_string)?
我需要在wstring和string之间进行转换.我想,使用codecvt facet应该可以解决问题,但它似乎不适用于utf-8语言环境.
我的想法是,当我将utf-8编码文件读取到字符时,一个utf-8字符被读入两个普通字符(这就是utf-8的工作原理).我想从我的代码中使用的库的wstring表示创建这个utf-8字符串.
有谁知道怎么做?
我已经尝试过了:
locale mylocale("cs_CZ.utf-8");
mbstate_t mystate;
wstring mywstring = L"??žýáí";
const codecvt<wchar_t,char,mbstate_t>& myfacet =
use_facet<codecvt<wchar_t,char,mbstate_t> >(mylocale);
codecvt<wchar_t,char,mbstate_t>::result myresult;
size_t length = mywstring.length();
char* pstr= new char [length+1];
const wchar_t* pwc;
char* pc;
// translate characters:
myresult = myfacet.out (mystate,
mywstring.c_str(), mywstring.c_str()+length+1, pwc,
pstr, pstr+length+1, pc);
if ( myresult == codecvt<wchar_t,char,mbstate_t>::ok )
cout << "Translation successful: " << pstr << endl;
else cout << "failed" << endl;
return 0;
Run Code Online (Sandbox Code Playgroud)
它为cs_CZ.utf-8语言环境返回'failed',并且对cs_CZ.iso8859-2语言环境正常工作.
我怎样才能将窄幅转换string为宽幅string?
我试过这个方法:
string myName;
getline( cin , myName );
wstring printerName( L(myName) ); // error C3861: 'L': identifier not found
wchar_t* WprinterName = printerName.c_str(); // error C2440: 'initializing' : cannot convert from 'const wchar_t *' to 'wchar_t *'
Run Code Online (Sandbox Code Playgroud)
但我得到上面列出的错误.
为什么我会收到这些错误?我该如何解决它们?
有没有其他方法可以直接将narrow字符串转换为wide字符串?
std::regex regexpy("y:(.+?)\"");
std::smatch my;
regex_search(value.text, my, regexpy);
y = my[1];
std::wstring wide_string = std::wstring(y.begin(), y.end());
const wchar_t* p_my_string = wide_string.c_str();
wchar_t* my_string = const_cast<wchar_t*>(p_my_string);
URLDownloadToFile(my_string, aDest);
Run Code Online (Sandbox Code Playgroud)
我正在使用Unicode,源字符串的编码是ASCII, UrlDownloadToFile扩展到UrlDownloadToFileW (wchar_t*)上面的代码在调试模式下编译,但有很多警告,如:
warning C4244: 'argument': conversion from 'wchar_t' to 'const _Elem', possible loss of data
Run Code Online (Sandbox Code Playgroud)
那么我想问一下,如何将 a 转换std::string为 a wchar_t?
我必须"翻译"一个:
char数据[32]
进入:
tstring数据;
其中tstringtypedef为std::string或std::wstring取决于预处理器定义.
假设data[32]只包含ASCII字符,那么将这些数据传递给tstring对象的最简单方法是什么?
考虑这个将窄字符串转换为宽字符串的函数:
std::wstring convert(const std::string& input)
{
try
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.from_bytes(input);
}
catch(std::range_error& e)
{
std::size_t length = input.length();
std::wstring result;
result.reserve(length);
for(std::size_t i = 0; i < length; i++)
{
result.push_back(input[i] & 0xFF);
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我很难理解在后备路径中需要这个表达式:
result.push_back(input[i] & 0xFF);
Run Code Online (Sandbox Code Playgroud)
为什么字符串中的每个字符都被 0xFF (0b11111111) 屏蔽?
你好,我开始学习 C++,我正在尝试学习以 L 开头的数据类型,比如
auto something = L"Monday";
Run Code Online (Sandbox Code Playgroud)
什么数据类型是自动的?以及如何将 a 转换std::string为这种数据类型?
std::string my_string = "Hello World"; 到 ? something = L"Hello World"
我正在std::string使用此代码修剪一个long 以使其适合文本容器.
std::string AppDelegate::getTrimmedStringWithRange(std::string text, int range)
{
if (text.length() > range)
{
std::string str(text,0,range-3);
return str.append("...");
}
return text;
}
Run Code Online (Sandbox Code Playgroud)
但在其他语言的情况下,如HINDI "??????"长度std::string是错误的.
我的问题是如何在所有测试用例中检索std :: string的准确长度.
谢谢