我无法理解之间的差异std::string和std::wstring.我知道wstring支持Unicode字符等宽字符.我有以下问题:
std::wstring用完std::string?std::string保存整个ASCII字符集,包括特殊字符吗?std::wstring由所有流行的C++编译器的支持?问题是如何将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) string s = "????";
wstring ws = FUNCTION(s, ws);
Run Code Online (Sandbox Code Playgroud)
我如何将s的内容分配给ws?
搜索谷歌并使用了一些技术,但他们无法分配确切的内容.内容失真.
我见过C++社区中的很多人(特别是freenode上的## c ++)对windows api 的使用wstrings和使用感到不满wchar_t.究竟是什么"错误"有wchar_t和wstring,如果我要支持国际化,有一些什么替代宽字符?
我正在使用std::string的find()方法来测试字符串是否是另一个字符串的子字符串.现在我需要不区分大小写的同一件事.对于字符串比较,我总是可以转向,stricmp()但似乎没有stristr().
我找到了各种答案,大多数建议使用Boost哪个不是我的选择.另外,我需要支持std::wstring/ wchar_t.有任何想法吗?
我有代码:
std::string st = "SomeText";
...
std::cout << st;
Run Code Online (Sandbox Code Playgroud)
这工作得很好.但现在我的团队想要搬到wstring.所以我尝试过:
std::wstring st = "SomeText";
...
std::cout << st;
Run Code Online (Sandbox Code Playgroud)
但这给了我一个编译错误:
错误1错误C2664:'std :: basic_string <_Elem,_Traits,_Ax> :: basic_string(const std :: basic_string <_Elem,_Traits,_Ax>&)':无法将参数1从'const char [8]'转换为'const std :: basic_string <_Elem,_Traits,_Ax>&'D:...\TestModule1.cpp 28 1 TestModule1
在搜索网络后,我读到我应该将其定义为:
std::wstring st = L"SomeText"; // Notice the "L"
...
std::cout << st;
Run Code Online (Sandbox Code Playgroud)
这个编译但打印"0000000000012342"而不是"SomeText".
我究竟做错了什么 ?
如何wstring在Windows平台上读取(UTF-8)文件?
我知道已经有StackOverflow上有关的几个问题std::string与std::wstring或类似,但没有人提出了一个完整的解决方案.
为了获得一个好的答案,我应该定义要求:
CFStringRef,wchar_t *,char*为UTF-8或其他类型的,因为它们是由OS API必需的.备注:我不需要代码页转换支持,因为我希望在所有支持的操作系统上只使用Unicode兼容的函数.我非常感谢每个答案只提出一个解决方案,通过这样做,人们可以投票选择他们喜欢的替代方案.如果您有多个替代方案,请添加另一个答案.
请说明一些对你有用的东西.
相关问题:
我有wstring格式的Windows注册表键值.现在我想将它传递给这个代码(第一个参数 - javaw.exe的路径):
std::wstring somePath(L"....\\bin\\javaw.exe");
if (!CreateProcess("C:\\Program Files\\Java\\jre7\\bin\\javaw.exe", <--- here should be LPCTSTR, but I have a somePath in wstring format..
cmdline, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
0, // Set handle inheritance to FALSE.
CREATE_NO_WINDOW, // ON VISTA/WIN7, THIS CREATES NO WINDOW
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi)) // Pointer to PROCESS_INFORMATION structure.
{
printf("CreateProcess …Run Code Online (Sandbox Code Playgroud) 我有一个wstring声明如此:
// random wstring
std::wstring str = L"abcàdëefŸg€hhhhhhhµa";
Run Code Online (Sandbox Code Playgroud)
文字将是UTF-8编码,因为我的源文件是.
[编辑:根据Mark Ransom,情况不一定如此,编译器将决定使用什么编码 - 让我们假设我从例如UTF-8编码的文件中读取此字符串]
我非常希望将其转换为文件读取(当文本编辑器设置为正确的编码时)
abcàdëefŸg€hhhhhhhµa
Run Code Online (Sandbox Code Playgroud)
但是ofstream不是很合作(拒绝接受wstring参数),并且wofstream据说需要知道语言环境和编码设置.我只想输出这组字节.通常如何做到这一点?
编辑:它必须是跨平台的,不应该依赖于UTF-8编码.我碰巧有一组存储在a中的字节wstring,并希望输出它们.它很可能是UTF-16或纯ASCII.