我想通过我声明的两个指针将文本输出到文件:
wchar_t *Col1="dsffsd", *Col2="sdfsf";
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的:
std::ofstream fout;
fout.open(NativeDatabasePathHist);
fout<<"testing";
fout<<" "<<Col1<<" "<<Col2;
fout.close();
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
测试113 113
为什么当我打印Col1和Col2,我得到的数字,而不是字符串?
这引起了我的兴趣,所以我要问一下 - 出于什么原因wchar_t在Linux/Linux类系统中使用的原因并不像在Windows上那么广泛?具体来说,Windows API在wchar_t内部使用,而我认为Linux没有,这反映在许多使用char类型的开源软件包中.
我的理解是,给定一个c需要多个字节来表示它的字符,然后在一个char[]表单c中分成几个部分,char*而它形成一个单元wchar_t[].那么,wchar_t总是使用它不容易吗?我是否错过了否定这种差异的技术原因?或者只是采用问题?
我在这里和其他地方看过其他一些帖子(见下文),但我仍然没有对这个问题有一个明确的答案:windows wchar_t如何处理基本多语言平面之外的unicode字符?
那是:
那么当你想在Windows上编写像(U + 2008A)Han Character这样的东西时,Windows会怎么做?
所以我终于回到了我的主要任务 - 将一个相当大的C++项目从Windows移植到Mac.
直接我遇到了wchar_t在Windows上为16位但在Mac上为32位的问题.这是一个问题,因为所有字符串都由wchar_t表示,并且在Windows和Mac机器之间会有来回的字符串数据(在磁盘数据和网络数据形式中).由于它的工作方式,在发送和接收数据之前将字符串转换为某种通用格式并不是完全简单的.
我们最近也开始支持更多语言,因此我们开始处理大量的Unicode数据(以及处理从右到左的语言).
现在,我可能会在这里混淆多个想法并为自己造成比需要更多的问题,这就是为什么我在问这个问题.我们认为将所有内存中的字符串数据存储为UTF-8非常有意义.它解决了wchar_t是不同大小的问题,这意味着我们可以轻松支持多种语言,它还可以大大减少我们的内存占用(我们有很多 - 主要是英文 - 字符串加载) - 但似乎很多人都没有这个.有什么我们想念的吗?有一个明显的问题,你必须处理字符串长度可以小于存储该字符串数据的内存大小.
或者使用UTF-16更好的主意?或者我们应该坚持使用wchar_t并编写代码来在我们读/写磁盘或网络的地方转换wchar_t和Unicode之间的转换?
我知道这是危险地接近要求的意见 - 但我们很紧张,因为我们忽视的东西明显,因为它似乎并不像有许多Unicode字符串类(例如) - 但尚未有足够的代码转换为/来自Unicode,如boost :: locale,iconv,utf-cpp和ICU.
最近我将Windows应用程序移植到Linux时出现问题,因为wchar_t这些平台之间存在大小差异.我试图使用编译器开关,但打印这些字符时出现问题(我认为GCC wcout认为所有wchar_t都是32位).
所以,我的问题是:有一个很好的方法(w)cout char16_t吗?我问,因为它不起作用,我被迫将其投射到wchar_t:
cout << (wchar_t) c;
Run Code Online (Sandbox Code Playgroud)
这似乎不是一个大问题,但它让我烦恼.
我正在编写一个程序,需要能够使用所有语言的文本.我的理解是UTF-8将完成这项工作,但我遇到了一些问题.
我是否可以说UTF-8可以存储char在C++中?如果是这样,为什么我在使用程序时会收到以下警告char,string并且stringstream:warning C4566: character represented by universal-character-name '\uFFFD' cannot be represented in the current code page (1252).(我使用时没有出现错误wchar_t,wstring并且wstringstream.)
另外,我知道UTF是可变长度的.当我使用at或substr字符串方法时,我会得到错误的答案?
char cmd[40];
driver = FuncGetDrive(driver);
sprintf_s(cmd, "%c:\\test.exe", driver);
Run Code Online (Sandbox Code Playgroud)
我不能用cmd在
sei.lpFile = cmad;
Run Code Online (Sandbox Code Playgroud)
那么,如何将char数组转换为wchar_t数组呢?
使用wchar_t对isalpha或isalnum的等效函数是什么?
wctype?
一个例子也会很好
谢谢
我目前正在开发一个业余爱好项目(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++ 11的新Unicode功能,虽然其他C++ 11编码问题非常有用,但我对cppreference的以下代码片段有疑问 .代码写入然后立即读取以UTF-8编码保存的文本文件.
// Write
std::ofstream("text.txt") << u8"z\u6c34\U0001d10b";
// Read
std::wifstream file1("text.txt");
file1.imbue(std::locale("en_US.UTF8"));
std::cout << "Normal read from file (using default UTF-8/UTF-32 codecvt)\n";
for(wchar_t c; file1 >> c; ) // ?
std::cout << std::hex << std::showbase << c << '\n';
Run Code Online (Sandbox Code Playgroud)
我的问题非常简单,为什么循环中wchar_t需要for?一个u8文本字符串可以使用一个简单的声明char *和UTF-8编码的位布局应告诉系统字符的宽度.似乎有一些从UTF-8到UTF-32的自动转换(因此wchar_t),但如果是这种情况,为什么转换是必要的?