各位大家好,下午好。因此,我仍然对这个场景感兴趣,但我有很大的抱负,而且我一直在努力学习。我认为自己擅长c ++,但我总是在编写DOS程序,最近我将我的视野扩展到了Windows API ....据说,我注意到了Windows API DOS与UNI-CODE交织在一起,而DOS使用ANSI ..所以我知道ANSI使用8位字符代码而UNI-CODE使用16位..所以我的问题是:
1)为什么这很重要..是否更具体或能够保存更多信息,因为它的16位经文8?我的意思是我知道有一些字符,ANSI不支持UNI-CODE,但是它?
2)TCHAR和WCHAR之间有什么区别,它只是16位版本的char?如果WCHAR是宽字符,那么TCHAR是什么?
3)我知道LPWSTR是指向宽字符串的长指针,但你何时会使用它,为什么?它只是一个窗户的东西?并不是一个长指针自动16位?这是否意味着常规指针是8位?如果是这样,你为什么需要额外的位?
4)接下来为什么你需要wstring,你需要在某些函数中使用wchar和tchar吗?即
wstring myStr;
TCHAR myChar;
if (myStr.find(myChar) != string::npos) { krmormrm }
还是重要..
char myChar;
if (myStr.find(myChar) != string::npos) { jnrnikvnr }
5)最后但并非最不重要的是,我在显示WCHAR和wstring甚至是没有转换的int时遇到了麻烦..例如(我想出来的那样)我做了:
WCHAR myChar = '1';
int i = 2;
wstring myString;
ofstream File1("myFile.txt");
if (File1.is_open())
{
File1 << (char)myChar; //if i didn't typecast it to char it displayed 49 instead of 1;
File1 << (WCHAR)i; //if i didn't typecast it to WCHAR(like to char instead)it displays symbols
WCHAR temp;
copy(myString.begin(), myString.end(), temp);
File1 << (char)temp;
}
好吧所以我对wstring和copy有点问题。我在我的真实程序中做了什么(这只是一个快速的重写)是花了9个WCHAR变量...用 wstringstream 将它们全部加载到它的变量(wss)然后加载到 myString < / em>(我的wstring变量)...所以为了确保它们都正确加载我将它复制到WCHAR temp中将它发送到file1所以我可以在物理上看到加载到它的内容但是由于某种原因它加载了我想要的变量和额外的变量,我不想要,我已经多次查看代码,发现没有错。所以我摆脱了复制功能,并使用for循环单独显示每个变量:
for (int i = 0; i < 81; i++)
{
File1 << "Box " << (WCHAR)i << ": " << (char)BoxNum[i] << "\n";
}
并且我总结了一切都保持正确的值...只是我正在将值输入到文本框中并检索文本并将其存储在单个变量中..文本框排列为9乘9 ...所以连续9个,9个连续...然后我使用第一行中的框中的变量并将其放在myString中,这样我就可以使用string.find()函数来检查那个行中的数字而不是框中的数字..我的问题是显示这个字符串......不管怎么说抱歉只是想提供尽可能多的信息,也许有人可以为我解决这个问题。
答案 0 :(得分:1)
8位字符编码只允许256个不同的字符,减去很多控制字符。这对于英语来说已经足够了,但是当你想要涵盖其他欧洲语言时,比如那些包含ößé
或ø
等奇怪字符的语言,这还远远不够。当然,您可以使用不同的代码页,在8位编码的较高128个代码点上放置不同的字符,但是如果您需要在同一个字符串中混合多种语言呢?那些有超过256个字符的中文语言呢?但是每个字符有16位,你可以使用超过60,000个代码点,这足以覆盖单个代码页中的整个basic multilingual plane。
长指针和短指针之间的区别主要是历史性的,在现代平台上并没有太多关注(当你真的想知道时,请检查this question)。 Windows API具有可追溯到第一个Windows版本的很长的遗产,所以你在那里找到了很多过时的东西。指针的长度取决于程序的类型。 32位程序有32位长指针,64位程序有64位长指针。编译64位程序时,LPWSTR将是64位指针(以16位字符的空终止数组)。
第一个代码仅在TCHAR为16位时有效,因为在这种情况下,WCHAR和TCHAR是相同的。当TCHAR为8位时,该代码不会编译,因为find-method需要与字符串相同的类型。
当您将16位字符串写入文件时,它会以16位字符串的形式写入文件。然后,当您使用文本编辑器打开它并且只看到垃圾时,可能是因为您的文本编辑器使用8位字符编码对其进行解释。将文本编辑器的编码切换为您编写文件的编码(UTF-16可能有效)。或者如您所述,在this question之前将wstring
转换为string
。但请记住,当字符串中的字符无法用8bit表示时,这不能很好地工作。