我是Windows编程的新手,在阅读了Petzold的书后,我想知道:
使用TCHAR类型和_T()函数来声明字符串或者我是否应该在新代码中使用wchar_t和L""字符串仍然是一种好习惯?
我将只针对Windows 2000及以上版本,我的代码将从一开始就是i18n.
Windows _setmbcp函数允许任何有效的代码页...
(UTF-7和UTF-8除外,不支持)
好的,不支持UTF-7是有道理的:字符具有非唯一的表示形式,并且会带来复杂性和安全风险.
但为什么不是UTF-8?
据我所知,Windows API函数的"ANSI"版本将其参数转换为UTF-16,调用等效的"W"函数,并将输出中的任何字符串转换为"ANSI".这就是我一直在手动做的事情.那么为什么Windows不能为我做呢?
我正在使用遗留应用程序,我正在尝试解决使用Multi byte character set和Not Set在Character Set选项下编译的应用程序之间的区别.
我理解使用Multi byte character set定义来编译_MBCS允许使用多字节字符集代码页,并且使用Not set不定义_MBCS,在这种情况下只允许单字节字符集代码页.
在使用的情况下Not Set,我假设我们只能使用此页面上的单字节字符集代码页:http://msdn.microsoft.com/en-gb/goglobal/bb964654.aspx
因此,我认为使用的是正确的Not Set,应用程序将无法编码和编写或读取远东语言,因为它们是在双字节字符集代码页(当然还有Unicode)中定义的?
接下来,如果Multi byte character定义了set,单字节和多字节字符集代码页是可用的,还是只有多字节字符集代码页?我猜它必须支持欧洲语言.
谢谢,
安迪
进一步阅读
这些页面上的答案没有回答我的问题,但在我的理解中有所帮助: 关于visual studio 2010中的"字符集"选项
研究
所以,就像工作研究一样......我的语言环境设置为日语
对硬编码字符串的影响
char *foo = "Jap text: ???";
wchar_t *bar = L"Jap text: ???";
Run Code Online (Sandbox Code Playgroud)
用.编译 Unicode
*foo = 4a 61 70 20 74 65 78 74 3a 20 83 65 83 …
我目前正在开发一个业余爱好项目(C/C++),它可以在Windows和Linux上运行,完全支持Unicode.可悲的是,Windows和Linux使用不同的编码使我们的生活更加困难.
在我的代码中,我试图尽可能地使用数据,使Windows和Linux都变得容易.在Windows中,wchar_t默认编码为UTF-16,在Linux中编码为UCS-4(如果我错了,请纠正我).
我的软件打开({_wfopen,UTF-16,Windows},{fopen,UTF-8,Linux})并将数据写入UTF-8文件.到目前为止,这一切都是可行的.直到我决定使用SQLite.
SQLite的C/C++接口允许一个或两个字节的编码字符串(单击).当然,这在Linux中不适用于wchar_t,因为Linux中的wchar_t默认为4个字节.因此,从sqlite编写和读取需要转换为Linux.
目前,代码混乱了Windows/Linux的例外情况.我希望坚持在wchar_t中存储数据的标准思路:
看完之后(这里)我确信我应该坚持使用Windows中的wchar_t.但是在完成所有这些工作之后,麻烦就开始于移植到Linux.
目前我正在考虑重做这一切以坚持使用简单的字符(UTF-8),因为它适用于Windows和Linux,记住我需要'WideCharToMultiByte'在Windows中的每个字符串来实现UTF-8.使用简单的基于char*的字符串将大大减少Linux/Windows的异常数量.
你对跨平台的unicode有经验吗?有关简单地以UTF-8存储数据而不是使用wchar_t的想法的想法?
基于C的Win32 API具有许多函数的双重版本,以支持unicode(UTF-16)字符串和较旧的8位代码页字符串.API还定义了泛型函数和类型,以便稍微抽象出来并允许从同一代码库中编译这两个版本.
Microsoft建议始终使用泛型(请参阅函数原型的约定),以便您可以编译这两个版本.但我的问题是 - 通过8位字符串API,我们在这里讨论支持哪些版本的Windows?如果它是Windows 95,那么我的优先级就不再高了:).如果泛型仅用于支持极端遗留情况,那么直接使用UTF-16调用似乎更容易和更清晰.
什么是TCHAR字符串,例如LPTSTR和LPCTSTR我如何使用它们?当我在Visual Studio中创建一个新项目时,它为我创建了这个代码:
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如,我如何连接所有命令行参数?
如果我想打开第一个命令行参数给出的名称的文件,我该怎么做?Windows API定义了许多函数的"A"和"W"版本,例如CreateFile,CreateFileA和CreateFileW; 那么这些如何彼此不同以及我应该使用哪一个?
当我#include <windows.h>在C或C++中时,我被迫决定字符的格式,其中TCHAR等于char或wchar_t.
我环顾四周相当多的并尽可能的职位如这一个或类似网站这点破wchar_t事儿来了约一个很久以前UTF8之前,对各种原因,并不是一个特别好的解决方案的Unicode现代编程.然而,这些并没有说明已经运行的现有系统的支持wchar_t.
所以我的问题是,我应该使用哪一个?如果我使用普通的char遗嘱将来会被MS抛弃,因为在一天结束时,wchar_tAPI 的版本是最近的?或者,如果我使用wchar_t,将我的代码运行在其他现代平台上是否会很痛苦,这些平台后来使用charUTF8中的普通版本开发?
首先,我只想在控制台中使用波罗的海字符并用它们执行 CMD 命令,但问题是从默认/标准控制台 C++ 应用程序开始的。
\n#include <iostream>\nint main() {\n string output = "\xc4\x81\xc4\x81\xc4\x81\xc4\x8d\xc4\x8d\xc4\x8d\xc4\x93\xc4\x93\xc4\x93\xc4\x93";\n\n cout << output << endl;\n}\nRun Code Online (Sandbox Code Playgroud)\n早些时候,我在堆栈上提出了这个问题 - How to use UTF8characters in DEFAULT C++ Project OR when using mysql Connector for C++ in Visual Studio 2019 (Latin7_general_ci to UTF-8)?
\n我在测试中发现:如果我将 UTF8 字符串转换为 Latin1 字符串,然后 cout 或打印十六进制值,我会在控制台中输出一些特殊字符。例如 -
\n**char s2[256] = "\\xc3\\xa9";** printed is outputted as "\xc4\xb7" THAT MEANS I need to convert strings into correct HEX values when it is needed, and some …Run Code Online (Sandbox Code Playgroud)