C或C+中是否有与setvbuf()等价的函数+;要处理宽字符? C++函数通过各种缓冲选项来调整文件流。但该流只能处理纯chars。宽字符(wchar\u t)是否有等效版本可用?setvbuf在Windows 8+中工作,可以在控制台窗口中写入UTF8。从Windows 10 build 1803开始,仍不支持读取UTF8
在Visual Studio中,您可以使用特定于编译器的C或C+中是否有与setvbuf()等价的函数+;要处理宽字符? C++函数通过各种缓冲选项来调整文件流。但该流只能处理纯chars。宽字符(wchar\u t)是否有等效版本可用?setvbuf在Windows 8+中工作,可以在控制台窗口中写入UTF8。从Windows 10 build 1803开始,仍不支持读取UTF8,c++,c,character-encoding,stream,buffer,C++,C,Character Encoding,Stream,Buffer,在Visual Studio中,您可以使用特定于编译器的\u setmode在控制台窗口中读取/写入UTF16。但这在其他编译器中可能不是一个选项(上次我检查时,MinGW-32不支持它)。唯一的其他选择是基于WriteConsoleW编写流函数 请注意,控制台窗口可能不支持在0xFFFF上方打印Unicode代码点,除非您使用SetCurrentConsoleFontEx将控制台字体更改为适当的字体,例如“MS哥特式”(仍然无法处理许多代码点) #包括 #包括 #包括 #包括 int main
\u setmode
在控制台窗口中读取/写入UTF16。但这在其他编译器中可能不是一个选项(上次我检查时,MinGW-32不支持它)。唯一的其他选择是基于WriteConsoleW
编写流函数
请注意,控制台窗口可能不支持在0xFFFF
上方打印Unicode代码点,除非您使用SetCurrentConsoleFontEx
将控制台字体更改为适当的字体,例如“MS哥特式”
(仍然无法处理许多代码点)
#包括
#包括
#包括
#包括
int main()
{
_setmode(_fileno(stdout),_O_16text);
_设置模式(_fileno(stdin),_O_16text);
标准:wcout>utf16;
std::wcout不需要等价物-您提供的char
数组足够大,可以容纳任意数量的wchar\u t
字符。您可能需要确保它足够对齐,仅此而已。您可能不需要wchar\u t
流。记住这一点。然后您需要解码UTF-8从char
流。即使在Windows上,您也最好使用UTF-8。然后,文件流有字节,您可以将它们解码为UTF-8。如何做到这一点是另一个问题。这不是字符数组,而是字节数组,在C中也被称为char
。是的。如果您需要Nwchar\u t
字符的缓冲区,请提供大小为N*sizeof(wchar\u t)
字节的缓冲区-作为常规的char
,因为setvbuf()
函数需要的是char*
而不是无符号char*
。请注意wchar\u t
的大小不一定是char
大小的两倍;它可能是大小的1倍或4倍(在不同的平台上),其尺寸范围甚至可能更大。
#include <iostream>
#include <string>
#include <io.h>
#include <fcntl.h>
int main()
{
_setmode(_fileno(stdout), _O_U16TEXT);
_setmode(_fileno(stdin), _O_U16TEXT);
std::wcout << L"UTF16 English ελληνικά\n";
std::wstring utf16;
std::wcin >> utf16;
std::wcout << utf16 << "\n";
return 0;
}