c – STL和UTF-8文件输入/输出.怎么做?

我使用wchar_t作为内部字符串,使用UTF-8作为文件存储.我需要使用STL将文本输入/输出到屏幕,并使用完整的立陶宛字符集来完成.

这一切都很好,因为我没有被迫为文件做同样的事情,所以下面的例子做得很好:

#include <io.h>
#include <fcntl.h>
#include <iostream>
    _setmode (_fileno(stdout), _O_U16TEXT);
    wcout << L"AaĄąfl" << endl;

但我变得好奇,并试图对文件做同样的事情没有成功.当然我可以使用格式化的输入/输出,但这是……气馁.

    FILE* fp;
    _wfopen_s (&fp, L"utf-8_out_test.txt", L"w");
    _setmode (_fileno (fp), _O_U8TEXT);
    _fwprintf_p (fp, L"AaĄą\nfl");
    fclose (fp);
    _wfopen_s (&fp, L"utf-8_in_test.txt", L"r");
    _setmode (_fileno (fp), _O_U8TEXT);
    wchar_t text[256];
    fseek (fp, NULL, SEEK_SET);
    fwscanf (fp, L"%s", text);
    wcout << text << endl;
    fwscanf (fp, L"%s", text);
    wcout << text << endl;
    fclose (fp);

这段代码完美无缺(虽然我不知道它如何处理格式错误的字符).那么,有没有办法:

>获取FILE *或整数文件句柄形成std :: basic_ * fstream?
>模拟_setmode()吗?
>扩展std :: basic_ * fstream,以便它处理UTF-8 I / O?

是的,我在一所大学学习,这与我的任务有些相关,但我想为自己解决这个问题.它不会影响我的成绩或类似的东西.

最佳答案 使用std :: codecvt_facet模板执行转换.

您可以使用标准std::codecvt_byname或非标准codecvt_facet implementation.

#include <locale>
using namespace std;
typedef codecvt_facet<wchar_t, char, mbstate_t> Cvt;
locale utf8locale(locale(), new codecvt_byname<wchar_t, char, mbstate_t> ("en_US.UTF-8"));
wcout.pubimbue(utf8locale);
wcout << L"Hello, wide to multybyte world!" << endl;

请注意,在某些平台上,codecvt_byname只能为系统中安装的区域设置发出转换.

点赞