我使用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只能为系统中安装的区域设置发出转换.