草庐IT

fshort-wchar

全部标签

c++ - char* 和 wchar_t* 的区别

我是MFC新手。我正在尝试做简单的mfc应用程序,但我在某些地方感到困惑。例如,SetWindowText有两个api,SetWindowTextA,SetWindowTextW一个api接受char*,另一个接受wchar_t*.char*和wchar_t*有什么用? 最佳答案 char用于所谓的ANSI函数系列(通常函数名称以A结尾),或者更常见的是使用ASCII字符集。wchar_t用于新的所谓的Unicode(或Wide)函数系列(通常函数名称以W结尾),它们使用UTF-16字符集。它与UCS-2非常相似,但又不完全相同。如

c++ - 为什么 char 既没有符号也没有符号,而 wchar_t 是?

下面的C++程序编译没有错误:voidf(char){}voidf(signedchar){}voidf(unsignedchar){}intmain(){}同一程序的wchar_t版本不会:voidf(wchar_t){}voidf(signedwchar_t){}voidf(unsignedwchar_t){}intmain(){}错误:‘voidf(wchar_t)’的重新定义voidf(signedwchar_t){}wchar_t似乎是unsigned。为什么重载会出现不一致? 最佳答案 char都是不同的类型,可以重载[

c++ - 您可以在编译时将 __func__ 转换为 wchar_t[] 吗?

所以我有这段代码wchar_tfuncName[]=__FUNCTIONW__;但是__FUNCTIONW__的问题是它的名称中包含类信息,而我只需要函数名称。现在__FUNCTIONW__只调用了_CRT_WIDE(__FUNCTION__)这让我觉得我可以调用_CRT_WIDE(__func__)但这给出了一个错误“identifierL__func__isundefined"__func__是一个隐式声明的标识符,当它在函数内部使用时,它会扩展为包含函数名称的字符数组变量。它是在C99中添加到C中的。来自C99§6.4.2.2/1:Theidentifier__func__isi

c++ - 覆盖 ctype<wchar_t>

我正在编写一个lambda演算解释器来娱乐和练习。我通过添加ctype让iostreams正确标记标识符将标点符号定义为空格的方面:structtoken_ctype:ctype{maskt[table_size];token_ctype():ctype(t){for(size_ttx=0;tx(classic_table()可能会更干净,但在OSX上不起作用!)然后在我点击标识符时交换facet:localetoken_loc(in.getloc(),newtoken_ctype);…localeconst&oldloc=in.imbue(token_loc);in.unget()>

c++ - 使用 libc++ 输出 wchar_t

#include#includeintmain(){std::locale::global(std::locale("en_US.utf8"));std::wcout这在libstdc++(gcc和clang)中按预期工作,但在libc++中仅打印第一个字符(碰巧是ASCII)。我在GentooLinux上使用libcxx-0.0_p20140322。这是libc++中的一个已知错误,还是只是我不知道如何cooking它?更新1.我试过了std::locale::global(std::locale("en_US.utf8"));std::locale::global(std::loc

c++ - 如何声明 wchar_t 并稍后设置其字符串值?

我正在为Windows开发,我没有找到关于如何正确声明和稍后设置unicode字符串的足够信息。到目前为止,wchar_tmyString[1024]=L"MyTestUnicodeString!";我假设上面所做的是[1024]是分配的字符串长度,我需要在该字符串中包含最多的字符数。L""确保引号中的字符串是unicode(我发现的一个alt是_T())。现在稍后在我的程序中,当我试图通过以下方式将该字符串设置为另一个值时,myString=L"Anothertext";我遇到编译器错误,我做错了什么?另外,如果有人有简单而深入的unicode应用程序资源,我想提供一些链接,这些链接

c++ - 将 wchar_t 转换为 int

如何将wchar_t('9')转换为int(9)?我有以下代码,用于检查peek是否为数字:if(iswdigit(peek)){//storepeekasnumeric}我可以只减去'0'还是有一些我应该担心的Unicode细节? 最佳答案 如果问题只涉及'9'(或罗马语之一数字),只需减去'0'就是正确的解决方案。如果您关心iswdigit返回的任何内容非零,但是,问题可能要复杂得多。这标准说iswdigit返回一个非零值,如果它参数是“十进制数字宽字符代码[在当前本地]”。这是模糊的,并由语言环境决定准确定义是什么意思。在“C

c++ - 检查 WCHAR 是否包含字符串

我有变量WCHARsDisplayName[1024];如何检查sDisplayName是否包含字符串“example”? 最佳答案 if(wcscmp(sDisplayName,L"example")==0);//thenitcontains"example"else;//itdoesnot这不包括sDisplayName中的字符串以“example”开头或中间有“example”的情况。对于这些情况,您可以使用wcsncmp和wcsstr。此外,此检查区分大小写。如果sDisplayName包含垃圾,这也会中断-i。e.不是空终

c++ - wchar 以一个或两个空字节结尾?

我只是不明白,也找不到太多关于wcharend的信息。如果它以单个空字节结尾,如果像“009A”这样的东西代表一个unicode符号,它怎么知道它还没有结束?如果它以两个空字节结尾?好吧,我不确定,需要确认。 最佳答案 由于宽字符串是宽字符数组,它甚至不能以单字节NUL结尾。它是一个两字节的NUL。(C/C++中的数组只能包含相同类型的成员,因此大小相同)。此外,对于ASCII标准字符,总是有一个或三个单字节0,因为只有扩展字符以非零第一个字节开头(取决于wchar_t是16位还是32位宽-为简单起见,我假设16位和小端):HELL

c++ - 为什么C/C++会自动将char/wchar_t/short/bool/enum类型转换为int?

因此,如果我理解得很好,积分提升提供了:char、wchar_t、bool、enum、short类型总是转换为int(或无符号整数)。然后,如果表达式中有不同的类型,将应用进一步的转换。我理解得很好吗?如果是,那么我的问题是:它为什么好?为什么?不要成为不必要的char/wchar_t/bool/enum/short吗?我的意思是例如:charc1;charc2;c1=c2;正如我之前所描述的,char总是被转换为int,所以在这种情况下,在自动转换之后它看起来像这样:intc1;intc2;c1=c2;但我不明白为什么这样好,如果我知道char类型就足以满足我的需要的话。