标签: wchar-t

将 (const) char * 转换为 LPCWSTR

我正在尝试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++ winapi wchar-t char lpcwstr

4
推荐指数
1
解决办法
2万
查看次数

为什么我需要在字符串前面加一个L并正确创建这个变量?

我是C++的新手,我很难完全理解数据类型的用法.

我将这些变量应用于createwindow参数和带有它的类.这采用LPCWSTR数据类型.

LPCWSTR szTitle = L"Hello";
LPCWSTR szWindowClass = L"There";
Run Code Online (Sandbox Code Playgroud)

因此,我这样做,虽然,我不明白为什么我必须在字符串之前包含L(调试器把它放在那里说实话).我也经常看到字符串被定义为直接类型(相反,我经常看到WCHAR,char等).如果你要制作这些变量,你会怎么写呢?我不相信我应该使用LPCWSTR.再说一遍,我很新,我无法找到我在网上寻找的确切内容.

c++ string wchar-t

4
推荐指数
1
解决办法
1436
查看次数

C++工作草案的措辞可能有缺陷(整数转换等级规则)

我在标准 C++工作草案中发现了一个可能的矛盾。我首先陈述事实,我的问题在最后。

整数转换等级建立时,[conv.rank]/1.1表示

任何两个有符号整数类型 [...] 不应具有相同的整数转换等级,即使它们具有相同的表示。

[basic.fundamental]/8说:

Typewchar_t是一种独特的类型,它具有实现定义的有符号或无符号整数类型作为其基础类型。

最后,[conv.rank]/1.8

的行列char8_tchar16_tchar32_t,和wchar_t应等于其基础类型的行列([basic.fundamental])。

如果它wchar_t被实现为有符号整数类型,它将与它的底层类型具有相同的等级,它是一些其他整数类型的不同类型。

因此,我们有两个具有相同等级的不同有符号整数类型,与 [conv.rank]/1.1 相矛盾。

这是一个实际的矛盾,还是我误解了 C++ 中两个可简单复制的类型是不同的类型?

c++ wchar-t language-lawyer c++20

4
推荐指数
1
解决办法
82
查看次数

std :: wcout << L"élève"的意外输出; 在Windows Shell中

在测试一些函数来转换wchar_t和utf8之间的字符串时,我在Visual C++ express 2008中遇到了以下奇怪的结果

std::wcout << L"élève" << std::endl;
Run Code Online (Sandbox Code Playgroud)

打印出"ÚlÞve:",这显然不是预期的.

这显然是一个错误.怎么可能 ?我怎么想处理这样的"功能"?

c++ unicode wchar-t mojibake

3
推荐指数
1
解决办法
1146
查看次数

wchar_t在visual studio中是2个字节,存储UTF-16.Unicode感知应用程序如何使用U + FFFF以上的字符?

我们正在计划让我们的应用程序识别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++

3
推荐指数
1
解决办法
4769
查看次数

将wchar_t转换为字符串?

我有一个wchar_t我想转换成一个string.然后应该使用读取字符串stringstream.我已经看过它在这里转换它:http://msdn.microsoft.com/en-us/library/ms235631( v = vs.80).aspx但它们都没有返回任何可用的东西stringstream.我对编码不是很有经验,所以我可能会遗漏一些非常简单的东西.

提前致谢!

c++ wchar-t

3
推荐指数
1
解决办法
2万
查看次数

boost :: format和wchar_t

我正在尝试使用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的内容.

c++ formatting boost wchar-t

3
推荐指数
1
解决办法
3276
查看次数

打印wchar_t会产生奇怪的输出

运行此代码段:

wchar_t *wstr = L"áßå®";
wprintf(L"%s",wstr);
Run Code Online (Sandbox Code Playgroud)

给出输出:

«

代替

áßå®

我是新来的wchar_t.我如何获得预期的输出?

c printf wchar-t format-specifiers

3
推荐指数
1
解决办法
437
查看次数

确定字符串是否是C中的有效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?

编辑

  • 我正在使用OS X El Capitan进行编程(但如果有可能,我会想要一个可移植的解决方案)
  • 在我的编程环境中,%S和%ls是相同的 - 这对我的问题并不重要
  • 当我没有为格式为%s的示例设置区域设置时,Printf也返回-1.这是我设置语言环境的唯一原因.
  • 我正在使用clang编译(Apple LLVM版本7.0.0(clang-700.1.76))

c string wchar-t

3
推荐指数
1
解决办法
436
查看次数

无法将'const char*'转换为'LPCWSTR {aka const wchar_t*}'

我的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创建者.

我该如何解决这个问题?谢谢!

c++ qt wchar-t type-conversion char

3
推荐指数
2
解决办法
1万
查看次数