我们有一个在 Windows 和 Linux 上运行的程序。它以二进制形式将 std::wstrings 写入文件。我们需要能够读取从 linux 写入 windows 的文件。我们将字符串写成 wchar_t 的列表。在 linux 上,每个 wchar_t 占用 4 个字节。在 Windows 上,每个 wchar_t 占用 2 个字节。
在将 linux 写入的文件读入 Windows 时,如何将 4 字节的 wchar_t 放入 2 字节的 wchar_t 中?
谢谢,亚当
我们有一个在 Windows 和 Linux 上运行的程序。它以二进制形式将 std::wstrings 写入文件。我们需要能够读取从 linux 写入 windows 的文件。我们将字符串写成 wchar_t 的列表。在 linux 上,每个 wchar_t 占用 4 个字节。在 Windows 上,每个 wchar_t 占用 2 个字节。
在将 linux 写入的文件读入 Windows 时,如何将 4 字节的 wchar_t 放入 2 字节的 wchar_t 中?
谢谢,亚当
假设 Linux 代码以 UTF-32 格式输出,您必须编写一些代码将字符串转换为 UTF-16,这是 Windows 上使用的 Unicode 编码。wstring 帮不了你。转换为 UTF-16 后,您可以在 Windows 上使用 wchar_t 将其存储在 wstring 中。
您可以使用UTF8-CPP轻松地将文件从 UTF-32 转换为 UTF-16:
#include <fstream>
#include <iterator>
#include <utf8.h>
int main(int argc, char** argv) {
std::ifstream file("source.txt");
std::string intermediate;
std::wstring result;
utf8::utf32to8(std::istreambuf_iterator<char>(file),
std::istreambuf_iterator<char>(),
std::back_inserter(intermediate));
utf8::utf8to16(intermediate.begin(),
intermediate.end(),
std::back_inserter(result));
}
不幸的是没有utf8::utf32to16
,尽管也许应该有。