c++ - 在 C 或 C++ 中是否有等效于 setvbuf() 的方法来处理宽字符?

标签 c++ c character-encoding stream buffer

C++ std::setvbuf函数可以通过各种缓冲选项来调节文件流。不过,该流只能处理普通的 char。是否有适用于宽字符 (wchar_t) 的等效版本可用?

最佳答案

setvbuf 在 Windows 8+ 中运行,以启用在控制台窗口中写入 UTF8。从 Windows 10 build 1803 开始​​,仍不支持读取 UTF8。

在 Visual Studio 中,您可以使用编译器特定的 _setmode 在控制台窗口中读取/写入 UTF16。但这在其他编译器中可能不是一个选项(我上次检查时 MinGW-32 不支持它)。唯一的其他选择是根据 WriteConsoleW 编写流函数。

请注意,控制台窗口可能不支持打印 0xFFFF 以上的 Unicode 代码点,除非您使用 SetCurrentConsoleFontEx 将控制台字体更改为合适的字体,例如 "MS Gothic”(仍然没有处理很多代码点)

#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;
}

关于c++ - 在 C 或 C++ 中是否有等效于 setvbuf() 的方法来处理宽字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52903141/

相关文章:

c++ - 将 vector 地址转换为 native 指针是否安全?

c - 声明主要原型(prototype)

mysql - 将所有列中的字符集 Latin1 转换为 Utf-8

ruby-on-rails - CGI 问题::unescapeHTML

c++ - 将 int 转换为 wstring

c++ - VS2008 是否支持 C++0x?

c++ - 将 C++ 引用包装到 C API 中

java - 读取未知编码的文本行

java - 按位运算的结果是否取决于 Java 中的字节顺序?在 C 或 C++ 中呢?

c - 将结构传递给函数