gpt4 book ai didi

c++ - 在 Linux 中读取 UTF-16 文件

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:20 26 4
gpt4 key购买 nike

我有以下程序将文件读​​入字符串缓冲区。

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

constexpr int BUFSIZE = 1024;

int main(int argc, char *argv[])
{
std::ifstream ifs(argv[1], std::ifstream::binary);
if(!ifs)
return 1;

string buffer(BUFSIZE, L'\0');
ifs.read(&buffer[0], BUFSIZE);

cerr << ifs.gcount() << endl;

return 0;
}

它打印出预期的 1024。

下面这个应该读入 wstring 缓冲区的程序却不工作。

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

constexpr int BUFSIZE = 1024;

int main(int argc, char *argv[])
{
std::wifstream ifs(argv[1], std::ifstream::binary);
if(!ifs)
return 1;

wstring buffer(BUFSIZE, L'\0');
ifs.read(&buffer[0], BUFSIZE);

cerr << ifs.gcount() << endl;

return 0;
}

Ir 使用相同的文件打印出 0。

如您所见,唯一的区别是将流更改为 wstream 并将缓冲区更改为 wstring。

我已经在 OpenSUSE Tumbleweed 下尝试了 g++ 8.2.1 和 clang++ 6.0.1。

问题/我的错误在哪里?

最佳答案

你应该使用 std::basic_ifstream<char16_t>std::u16string对于 UTF-16。 std::wifstreamstd::wstring不合适,因为 wchar_t 的宽度是实现定义的。特别是在 Linux 中,它(通常?)32 位宽。

字 rune 字也是如此。你应该使用 u'\0'等而不是 L'\0' .

关于c++ - 在 Linux 中读取 UTF-16 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53596654/

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