c++ - 如何在 C++17 中读取 UTF-16 文本文件

标签 c++ visual-c++ unicode c++17 utf-16

我是 C++ 的新手。我想在 Visual Studio 2019 中读取 C++17 中的 UTF-16 文本文件。

我尝试了网上的几种方法(包括 StackOverflow),但没有一种有效,而且有些方法无法编译(我认为它们只支持较旧的编译器)。

我试图在不使用任何第 3 方库的情况下实现这一目标。

这会读取一个文本文件,但每个字母之间有一些奇怪的字符和空格。

// open file for reading
std::wifstream istrm(filename, std::ios::binary);
if (!istrm.is_open()) {
    std::cout << "failed to open " << filename << '\n';
}
else {
    std::wstring s;
    std::getline(istrm, s);
    std::wcout << s << std::endl;
}

然后我使用以下库找到了一些解决方案

#include <locale>
#include <codecvt>

// open file for reading
std::wifstream istrm(filename, std::ios::binary);
istrm.imbue(std::locale(istrm.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
if (!istrm.is_open()) {
    std::cout << "failed to open " << filename << '\n';
}
else {
    std::wstring s;
    std::getline(istrm, s);
    std::wcout << s << std::endl;
}

这次它甚至没有编译,在 std::codecvt_utf16 行出现以下错误:

Error C4996 'std::codecvt_utf16': warning STL4017: std::wbuffer_convert, std::wstring_convert, and the header (containing std::codecvt_mode, std::codecvt_utf8, std::codecvt_utf16, and std::codecvt_utf8_utf16) are deprecated in C++17. (The std::codecvt class template is NOT deprecated.) The C++ Standard doesn't provide equivalent non-deprecated functionality; consider using MultiByteToWideChar() and WideCharToMultiByte() from instead. You can define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING or _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS to acknowledge that you have received this warning.

如果有人能为此提供解决方案,我将不胜感激。

提前致谢。

最佳答案

首先,阅读相关问题,例如 Does std::wstring support UTF-16 and UTF-32 on Windows?Is 16-bit wchar_t formally valid for representing full Unicode?

如果您想要的只是将字符串作为您已知其编码为 UTF-16 的 blob 进行读/写,而不执行任何转换或操作,并且您所处的环境类似于 Windows 上的 Visual Studio 2019,其中 wchar_t is intended to hold UTF-16 , 然后你可以使用 C++ 宽字符串和流。

现在,如果您需要执行转换、支持多种编码、在字符串中迭代(对于迭代的某些定义),或者一般来说任何重要的事情,如果您想留在 C 中,您现在就不走运了++17。 C++ 标准委员会已经为 Unicode 建立了一个工作组,因此期待在未来几年看到该领域的一些改进。目前,您需要使用 MultiByteToWideCharWideCharToMultiByte 等 Win32 函数,或者使用 Unicode 国际组件 (ICU) 或 Boost 的 Locale 等外部库。

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

相关文章:

c++ - 映射 C++ 反向迭代器

visual-c++ - 从视频中获取帧

Java 将字符串转换为 Unicode 字符。 "U+1F600"= 😀

unicode - 完整的等宽 Unicode 字体?

c++ - 使用 libc++ 输出 wchar_t

c++ - 常量变量初始化仅适用于成员初始化列表

c++ - Visual C++ volatile

mysql - UTF-8字符有问题;我看到的不是我存储的

c++ - C++/LabVIEW互操作: error extracting data from LabVIEW array/unexpected type conversion in function parameter

c++ - 错误LNK2019,如何解决? *更新*