gpt4 book ai didi

c++ - 是否可以在 VSVC 和 GCC 中统一 std::wstring 行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:21 24 4
gpt4 key购买 nike

这里是从 UFT-8 文件中读取一行的小代码:

#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <locale>
#include <fstream>
#include <codecvt>

int main()
{
_setmode(_fileno(stdout), _O_U8TEXT);

auto inputFileStream = std::wifstream("input.txt");
const auto utf8Locale = std::locale(std::locale(), new std::codecvt_utf8<wchar_t>());
inputFileStream.imbue(utf8Locale);

std::wstring line;
std::getline(inputFileStream, line);
std::wcout << line << std::endl;

inputFileStream.close();
return 0;
}

当我使用 Visual Studio Visual C++ 编译器构建它时,我得到了下一个结果:

test τεστ тест

正如预期的那样。

当我将 MinGW 与 GCC 编译器一起使用时,我得到了

琀攀猀琀 쐃딃쌃쐃 䈄㔄䄄䈄

如您所知,这不是预期的结果。

  1. 是否存在任何简单方法来将 GCC 的输出修复为预期的字符串?

  1. 是否有任何简单方法可以将 UTF-8 用于 MSVC 和 GCC?

回答(感谢 Igor TandetnikRemy Lebeau):看来,我们必须明确指定端模式,因为 MSVC 和 GCC 有不同的默认值。所以

new std::codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>()

应该使用。

固定代码:

#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <locale>
#include <fstream>
#include <codecvt>

int main()
{
_setmode(_fileno(stdout), _O_U8TEXT);

auto inputFileStream = std::wifstream("input.txt");
const auto utf8Locale = std::locale(std::locale(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>());
inputFileStream.imbue(utf8Locale);

std::wstring line;
std::getline(inputFileStream, line);
std::wcout << line << std::endl;

inputFileStream.close();
return 0;
}

最佳答案

对于你的第二个问题,一个选择是将 utf16 和 std::w 前缀的东西的使用限制在你需要与操作系统交换 utf16 编码的字符串的情况下。当您在 wmain 中接收参数、使用 _wfopen 打开文件、调用 Windows API 函数等时,就会发生这种情况。否则,您将存储、从用户那里获取并返回给用户使用 char 类型的 utf8 字符串(char*std::string 等)。 utf8 和 utf16 之间的转换可以通过 MultiByteToWideCharWideCharToMultiByte 完成,绕过迟钝的 c++ 编码 api。这不能很好地工作的地方是控制台输入/输出。总体而言,如果用户设置了 chcp 65001 和 ttf 字体,您可以将 utf8 输出到控制台。至少在 Windows 7 中,您还必须确保不要在两个写入调用之间拆分字符,否则将无法正确打印(这也意味着您不能使用 std::cout,因为 msvcrt将分别为每个字节调用 putc,您需要使用 putsfprintf 等);我听说这已在 Windows 10 中修复,但无法确认。据我所知,使用文件 api 从控制台读取 utf8 是行不通的;如果需要,您需要检测到标准输入已连接到控制台并改为使用控制台 api。

关于c++ - 是否可以在 VSVC 和 GCC 中统一 std::wstring 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54895332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com