Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';这个字符转换不起作用吗?_C++_Visual Studio_Character Encoding - Fatal编程技术网

C++ 为什么';这个字符转换不起作用吗?

C++ 为什么';这个字符转换不起作用吗?,c++,visual-studio,character-encoding,C++,Visual Studio,Character Encoding,Visual Studio 2008 编译为多字节字符集的项目 LPWSTR lpName[1] = {(WCHAR*)_T("Setup")}; 在此转换之后,lpName[0]包含垃圾(至少在VS中预览时) LPWSTR的类型定义如下: typedef\uuu-WCHAR*NWPSTR,*LPWSTR,*PWSTR我想你要找的是 LPTSTR lpName[1] = {_T("Setup")}; 带有T的各种类型定义(例如TSTR,LPTSTR)取决于您使用的是uni

Visual Studio 2008

编译为多字节字符集的项目

LPWSTR lpName[1] = {(WCHAR*)_T("Setup")};
在此转换之后,
lpName[0]
包含垃圾(至少在VS中预览时)

LPWSTR
的类型定义如下:

typedef\uuu-WCHAR*NWPSTR,*LPWSTR,*PWSTR

我想你要找的是

LPTSTR lpName[1] = {_T("Setup")};
带有
T
的各种类型定义(例如
TSTR
LPTSTR
)取决于您使用的是unicode还是多字节或其他任何形式。通过使用这些,您应该能够以您正在使用的任何编码编写工作的代码(即,明天您可以切换到ascii,并且大部分代码仍然可以工作)

编辑
如果您确实需要在编码之间进行转换,那么可以使用各种转换函数,例如(或)和。这些都是在
中定义的,这是我上面评论的扩展版本

显示的代码将类型a的指针强制转换为类型B的指针。这是一种低级别、依赖于机器的操作。它几乎不能将类型a的对象转换为类型B的对象,尤其是当一种类型是常规字符类型而另一种类型是宽字符时

想象一下,你拿了一本法语书,大声朗读,好像它是用英语写的

FRENCH* book;
readaloud ((ENGLISH*) book);
你多半会听到胡言乱语。两种语言中使用的字母是相同的(或相似的,无论如何),但两种语言的规则是完全不同的。两种语言的表达方式相同,但含义不同

这与我们这里的情况非常相似。无论您有什么类型,位和字节都是相同的,但规则完全不同。您可以根据常规字符规则提取位,并尝试根据宽字符规则解释它们。它不起作用。在这两种情况下,表示法是相同的,但含义不同

要将一种字符风格转换为另一种,通常需要一个查找表或其他方法将每个字符从一种类型转换为另一种类型-更改表示形式,但保留其含义。同样,要将法语书转换成英语书,您需要使用一个大的查找表a.k.a.字典。。。好吧,这里的类比中断了,因为没有正式的转换规则,你需要有创造性!但你明白了

< C++的规则实际上禁止这样的强制转换。只能将对象类型poiner强制转换为
void*
,并且只能使用结果将其强制转换回原始对象类型。其他一切都是不允许的(除非你愿意在未定义的行为领域冒险)

那你该怎么办

  • 选择一个字符变体并坚持使用它
  • 如果必须在两种口味之间进行转换,请使用库函数进行转换
  • 尽量避免指针投射,它们几乎总是发出故障信号

  • 如果您是为
    \u MBCS
    编译,则
    \u T
    不宽。你可能想要
    L“字符串在这里”
    ,然后你就不需要
    (WCHAR*)
    演员了。哦,我明白了。它不起作用,因为它不是craracter转换。这是一个指针投射。字符转换是通过字符转换函数完成的。感谢您提供最有说服力的解释-Andrew S。我建议ATL(/MFC)转换助手: