【问题标题】:Is there an equivalent to setvbuf() in C or C++ to handle wide characters?在 C 或 C++ 中是否有等效于 setvbuf() 的方法来处理宽字符?
【发布时间】:2018-10-20 06:44:52
【问题描述】:

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

【问题讨论】:

  • 不需要等价物——你提供一个 char 数组,其大小足以容纳你想要的任意数量的 wchar_t 字符。您可能必须确保它充分对齐,仅此而已。
  • 您可能不想要wchar_t 的流。请记住UTF-8 is everywhere。然后您需要从char 流中解码 UTF-8。
  • 即使在 Windows 上,您也最好使用 UTF-8。然后文件流有 bytes 并且您将它们解码为 UTF-8。如何做到这一点是一个不同的问题
  • 它不是一个字符数组,而是一个字节数组,它在 C 中也被称为 char
  • 是的。如果您想要一个包含 N 个wchar_t 字符的缓冲区,请提供一个大小为 N * sizeof(wchar_t) 字节的缓冲区 — 与常规 char 一样,因为 setvbuf() 函数需要一个 char * 而不是 unsigned char *。请注意wchar_t 的大小不必是char 的两倍;它可能是相当合理的大小的 1 或 4 倍(在不同平台上),并且大小范围甚至可能更大。

标签: c++ c character-encoding stream buffer


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2011-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多