问题描述
我们知道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形式读取文件的内容,并注意字符编码。