我正在尝试FindWindow()从 WinAPI使用,我想从用户那里询问窗口标题的输入:
char *input;
cout << "Window title: ";
cin >> input;
Run Code Online (Sandbox Code Playgroud)
很标准。那么,我如何将其转换为LPCWSTRfor FindWindow()?
我已经尝试了以下方法:_T(input), TEXT(input),(LPCWSTR)input但它们都不起作用。我也尝试使用wchar_t而不是char,但我char在其他地方都需要,所以我会因为使用wchar_t而不是char......
我是C++的新手,我很难完全理解数据类型的用法.
我将这些变量应用于createwindow参数和带有它的类.这采用LPCWSTR数据类型.
LPCWSTR szTitle = L"Hello";
LPCWSTR szWindowClass = L"There";
Run Code Online (Sandbox Code Playgroud)
因此,我这样做,虽然,我不明白为什么我必须在字符串之前包含L(调试器把它放在那里说实话).我也经常看到字符串被定义为直接类型(相反,我经常看到WCHAR,char等).如果你要制作这些变量,你会怎么写呢?我不相信我应该使用LPCWSTR.再说一遍,我很新,我无法找到我在网上寻找的确切内容.
我在标准 C++的工作草案中发现了一个可能的矛盾。我首先陈述事实,我的问题在最后。
当整数转换等级建立时,[conv.rank]/1.1表示
任何两个有符号整数类型 [...] 不应具有相同的整数转换等级,即使它们具有相同的表示。
Type
wchar_t是一种独特的类型,它具有实现定义的有符号或无符号整数类型作为其基础类型。
最后,[conv.rank]/1.8:
的行列
char8_t,char16_t,char32_t,和wchar_t应等于其基础类型的行列([basic.fundamental])。
如果它wchar_t被实现为有符号整数类型,它将与它的底层类型具有相同的等级,它是一些其他整数类型的不同类型。
因此,我们有两个具有相同等级的不同有符号整数类型,与 [conv.rank]/1.1 相矛盾。
这是一个实际的矛盾,还是我误解了 C++ 中两个可简单复制的类型是不同的类型?
在测试一些函数来转换wchar_t和utf8之间的字符串时,我在Visual C++ express 2008中遇到了以下奇怪的结果
std::wcout << L"élève" << std::endl;
Run Code Online (Sandbox Code Playgroud)
打印出"ÚlÞve:",这显然不是预期的.
这显然是一个错误.怎么可能 ?我怎么想处理这样的"功能"?
我们正在计划让我们的应用程序识别Unicode,我们正在分析我们将遇到的问题.
特别是,我们的应用程序将严重依赖于字符串的长度,我们希望将其wchar_t用作基本字符类.
当处理必须以UTF-16中的2个16位单位存储的字符时出现问题,即U + 10000以上的字符.
简单的例子:
我有UTF-8字符串"蟂"(Unicode字符U + 87C2,UTF-8:E8 9F 82)
所以,我设置以下代码:
const unsigned char my_utf8_string[] = { 0xe8, 0x9f, 0x82, 0x00 };
// compute size of wchar_t buffer.
int nb_chars = ::MultiByteToWideChar(CP_UTF8, // input is UTF8
0, // no flags
reinterpret_cast<char *>(my_utf8_string), // input string (no worries about signedness)
-1, // input is zero-terminated
NULL, // no output this time
0); // need the necessary buffer size
// allocate
wchar_t *my_utf16_string = new wchar_t[nb_chars];
// convert
nb_chars …Run Code Online (Sandbox Code Playgroud) unicode wchar-t buffer-overflow visual-studio-2010 visual-c++
我有一个wchar_t我想转换成一个string.然后应该使用读取字符串stringstream.我已经看过它在这里转换它:http://msdn.microsoft.com/en-us/library/ms235631( v = vs.80).aspx但它们都没有返回任何可用的东西stringstream.我对编码不是很有经验,所以我可能会遗漏一些非常简单的东西.
提前致谢!
我正在尝试使用boost格式化字符串:
wchar_t *msg;
// fill msg
boost::format("Error: %s") % msg).str()
Run Code Online (Sandbox Code Playgroud)
我得到的不是msg的内容,是以十六进制表示的msg的地址.
这些事情没有成功:
boost::format("Error: %s") % new std::wstring(msg)
boost::format("Error: %1%") % msg
Run Code Online (Sandbox Code Playgroud)
注意:即使我认为它无关紧要,但我填写msg的方式是:
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | 40, NULL, GetLastError(), MAKELANGID(0, SUBLANG_ENGLISH_US), (LPTSTR) &msg, 512, NULL);
Run Code Online (Sandbox Code Playgroud)
和Visual Studio Watch正确显示msg的内容.
运行此代码段:
wchar_t *wstr = L"áßå®";
wprintf(L"%s",wstr);
Run Code Online (Sandbox Code Playgroud)
给出输出:
«
代替
áßå®
我是新来的wchar_t.我如何获得预期的输出?
我正在尝试重新编写printf的一部分.
setlocale(LC_ALL, "en_US.UTF-8");
int ret = printf("%S\n", "??????");
printf("Printf returned %d\n", ret);
Run Code Online (Sandbox Code Playgroud)
如果格式为%s,则printf写入宽字符并返回19.
如果格式为%S,则printf返回-1,因为参数不是宽字符串(在""之前没有L).
在我自己的printf实现中,如何确定参数中传递的字符串是否宽,所以如果不是,我可以返回-1?
编辑
我的C++代码中出现了一个我无法理解的错误.剥离的代码位在这里:
RS232Handle=OpenRS232("COM1", 9600);
HANDLE OpenRS232(const char* ComName, DWORD BaudRate)
{
ComHandle=CreateFile(ComName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: cannot convert 'const char*' to 'LPCWSTR {aka const wchar_t*}' for argument '1' to 'void* CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE)'
ComHandle=CreateFile(ComName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Run Code Online (Sandbox Code Playgroud)
代码取自VS代码,我现在正在使用Qt创建者.
我该如何解决这个问题?谢谢!