在macOS上将文件内容读取到wchar_t4Bytes的正确方法是什么?

问题描述

我们知道wchar_t在Windows上是2字节,在macOS / Linux上是4字节。

我正在尝试读取具有Unicode字符串但该字符串读取不正确(未知符号)的文件

basic_ifstream<wchar_t> file("/Documents/file.txt",ios_base::ate); // or wifstream
if(!file.is_open()){
    cout << "Cannot open the file." << endl;
}
streamsize size = file.tellg();
file.seekg(0);
wstring str (size,0); // or (size / 4,0)
file.read(reinterpret_cast<wchar_t*>(&str[0]),size);
file.close();

在调试该代码以查看字符串是否正确读取时,我发现字符串读取错误(未知符号)。

将Unicode文件内容读入wchar_t的正确方法是什么?

解决方法

正确阅读的一种方法是:

    #include <iostream>
    #include <fstream> // for wifstream
    #include <codecvt> // for locale & codecvt_utf8
    #include <sstream> // for wstringstream
    using namespace std;

    int main() {
        wifstream wif("file.txt");
        wif.imbue(locale(locale::empty(),new codecvt_utf8_utf16<wchar_t>));
        wstringstream wss;
        wss << wif.rdbuf();
        wstring wstr = wss.str();
        return 0;
    }
,

正确的方法是使用一行Cocoa函数,该函数以NSString形式读取文件的内容,并注意字符编码。