中文使用ofstream/wfstream/qtextstream写入
来源:互联网 发布:数据清洗与整合平台 编辑:程序博客网 时间:2024/06/08 06:46
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
先写认知的结果:
1. 存储格式:
local8Bit指的是当前文本的编码格式,ansi(gb2312…)
std::string/CStringA存储的是utf8格式
std::wstring/CStringW存储的是utf16(unicode)格式
QString存储的是utf16(unicode)格式
2. 中文输出
ofstream/ofwstream对于char*的支持效果是基本一致的
ofstream/ofwstream对于wchar的支持都不是很好,输出的都不太正常,需要特殊处理才正常。
3. 建议
a. 如果使用Qt库,建议使用QTextStream,QTextStream重载了QTextStream &operator>>(QString &s),可以直接把QString存储的内容输出到文本文件中。
并且可以使用setCodec("gb2312")/setCodec("UTF-16")等设置想要的格式,很方便。
b. 如果使用wfstream输出wstring的话,建议可以ansi格式输出,定imbue(std::locale("chinese")),来输出ansi
参考:http://doc.qt.io/qt-4.8/qtextcodec.html#details
参考:http://www.cppblog.com/deane/archive/2011/08/11/153007.aspx
参考:https://msdn.microsoft.com/library/windows/desktop/dd373814.aspx
参考:https://msdn.microsoft.com/zh-cn/library/windows/desktop/dd373763.aspx
参考:https://www.zhihu.com/question/55601459
参考:https://www.zhihu.com/search?type=content&q=locale
下面是例子:
使用QTextStream的效果是比较赞的,都可以得到预期的结果
QString sDestText = QString::fromLocal8Bit("abc体积");
// ansi输出码流:61 62 63 CC E5 BB FD
QFile qfile1("f:\\q-ansi.txt");
if (qfile1.open(QIODevice::ReadWrite|QIODevice::Truncate))
{
QTextStream qstream(&qfile1);
qstream.setCodec("gb2312");
qstream << sDestText;
}
// utf8输出码流:61 62 63 E4 BD 93 E7 A7 AF
QFile qfile2("f:\\q-utf8.txt");
if (qfile2.open(QIODevice::ReadWrite|QIODevice::Truncate))
{
QTextStream qstream(&qfile2);
qstream.setCodec("UTF-8");
qstream << sDestText;
}
// unicode输出:FF FE 61 00 62 00 63 00 53 4F EF 79
QFile qfile3("f:\\q-unicode.txt");
if (qfile3.open(QIODevice::ReadWrite|QIODevice::Truncate))
{
qfile3.write("\xFF\xFE", 2);
QTextStream qstream(&qfile3);
qstream.setCodec("UTF-16");
qstream << sDestText;
}
这个是中文输出的结果:在不指定字符集imbue的情况下,缺省情况
1. std::string以utf8格式输出
2. QSting.toLocal8Bit()以ANSI(gb2312)输出
3. ofstream/ofwstream对于wchar的支持都不是很好,直接<<输出的不太正常
4. ofstream/ofwstream对于char*的支持效果是基本一致的
5. std::wstring在ofwstream指定字符集以后,按照字符集输出:
//ansi
stream.imbue(std::locale("chinese"));
stream.imbue(std::locale("chs"));
stream.imbue(std::locale("chinese-simplified"));
Locale Name的格式有:
<language>
<language>-<Script>
<language>-<Script>-<REGION>
<language>-<Script>-<REGION>_<sort order>
<language>-<REGION>-x-<custom>
<language>-<Script>-<REGION>-x-<custom>
这些都是ANSI的编码格式,在window下,是不能设置出utf8的locale的。
QString sDestText = QString::fromLocal8Bit("abc体积");
std::wstringwText =sDestText.toStdWString(); // 内部unicode
std::stringtext =sDestText.toStdString(); // 内部utf8
QByteArray local8Bit = sDestText.toLocal8Bit(); // 内部ansi
// std::wstring输出的是一个数字地址:004CC11C
std::ofstreamstream1;
stream1.open(L"f:\\a.txt",ios::out|ios::trunc);
stream1 << wText.c_str();
stream1.close();
// std::wstring使用write方法直接输出:结果为unicode正常FF FE 61 00 62 00 63 00 53 4F EF 79
{
std::ofstreamstream1;
stream1.open(L"f:\\a.txt",mode);
stream1.write("\xFF\xFE", 2);
stream1.write((char*)(wText.c_str()),wText.length() * 2);
stream1.close();
}
// std::wstring输出码流:61 62 63 CC E5 BB FD
std::wfstreamwstream1;
wstream1.open("f:\\wa.txt",ios::out|ios::trunc|ios::binary);
wstream1.imbue(std::locale("chs"));
wstream1<<wText.c_str();
wstream1.close();
// std::string输出码流utf8:61 62 63 E4 BD 93 E7 A7 AF
std::fstreamstream2;
stream2.open("f:\\b.txt",ios::out|ios::trunc);
stream2 << text.c_str();
stream2.close();
// std::string输出码流utf8:61 62 63 E4 BD 93 E7 A7 AF
std::wfstreamwstream2;
wstream2.open("f:\\wb.txt",ios::out|ios::trunc|ios::binary);
wstream2 << text.c_str();
wstream2.close();
// toLocal8Bit输出码流ansi:61 62 63 CC E5 BB FD
std::fstreamstream3;
stream3.open("f:\\c.txt",ios::out|ios::trunc);
stream3 << local8Bit.data();
stream3.close();
// toLocal8Bit输出码流ansi:61 62 63 CC E5 BB FD
std::wfstreamwstream3;
wstream3.open("f:\\wc.txt",ios::out|ios::trunc|ios::binary);
wstream3 << local8Bit.data();;
wstream3.close();
附录1:QTextStream的字符格式
参考http://doc.qt.io/qt-5/qtextcodec.html
The supported encodings are: 常用 GB2312(GB18030),UTF8,UTF16
Big5
Big5-HKSCS
CP949
EUC-JP
EUC-KR
GB18030
HP-ROMAN8
IBM 850
IBM 866
IBM 874
ISO 2022-JP
ISO 8859-1 to 10
ISO 8859-13 to 16
Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml
KOI8-R
KOI8-U
Macintosh
Shift-JIS
TIS-620
TSCII
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
Windows-1250 to 1258
附录2:Std::locale的字符格式
// 这个缺省构造函数是获得当前程序的locale,用法如下
// 通常未设置时,通常缺省的locale name是"C"
std::localeapp_loc =std::locale();
std::stringapp_loc_name =app_loc.name();
// 将new_loc设置为当前全局locale,并将原来的locale返回给old_loc
// 通常未设置时,缺省的global local也是"C"
std::localeold_loc =std::locale::global(app_loc);
// 获取"C"Local
std::localec_loc =std::locale::classic();
语言字符串 等效区域设置名称
american zh-CN
american english zh-CN
american-english zh-CN
australian en-AU
belgian nl-BE
canadian en-CA
chh zh-HK
chi zh-SG
chinese zh
chinese-hongkong zh-HK
chinese-simplified zh-CN
chinese-singapore zh-SG
chinese-traditional zh-TW
dutch-belgian nl-BE
english-american zh-CN
english-aus en-AU
english-belize en-BZ
english-can en-CA
english-caribbean en-029
english-ire en-IE
english-jamaica en-JM
english-nz en-NZ
english-south africa en-ZA
english-trinidad y tobago en-TT
english-uk en-GB
english-us zh-CN
english-usa zh-CN
french-belgian fr-BE
french-canadian fr-CA
french-luxembourg fr-LU
french-swiss fr-CH
german-austrian de-AT
german-lichtenstein de-LI
german-luxembourg de-LU
german-swiss de-CH
irish-english en-IE
italian-swiss it-CH
norwegian no
norwegian-bokmal nb-NO
norwegian-nynorsk nn-NO
portuguese-brazilian pt-BR
spanish-argentina es-AR
spanish-bolivia es-BO
spanish-chile es-CL
spanish-colombia es-CO
spanish-costa rica es-CR
spanish-dominican republic es-DO
spanish-ecuador es-EC
spanish-el salvador es-SV
spanish-guatemala es-GT
spanish-honduras es-HN
spanish-mexican es-MX
spanish-modern es-ES
spanish-nicaragua es-NI
spanish-panama es-PA
spanish-paraguay es-PY
spanish-peru es-PE
spanish-puerto rico es-PR
spanish-uruguay es-UY
spanish-venezuela es-VE
swedish-finland sv-FI
swiss de-CH
uk en-GB
us zh-CN
usa zh-CN
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
- 中文使用ofstream/wfstream/qtextstream写入
- wfstream的中文bug!
- wfstream写入unicode字符串很多陷阱
- QTextStream换行与追加写入
- QTextStream的使用
- ofstream写入数据
- ofstream写入csv文件
- QTextStream
- QTextStream
- 使用QTextStream实现文本文件拷贝
- QFile和QTextStream配合使用
- QTextStream的使用 读写文件
- QTextStream格式带中文对齐输出问题
- 使用POI,写入中文字符
- ofstream 支持中文
- Qt使用Qtextstream进行换行操作
- 关于使用wofstream ,中文字符写入错误
- 使用Cookie写入中文字符会报错
- 解毒batch normalization
- 918
- 登陆(第一次登陆不再登陆,保存密码)
- Python初步了解(二)
- 步进电机的名词概念解析
- 中文使用ofstream/wfstream/qtextstream写入
- CDQZ Challenge 6
- mysql中索引利用情况(explain用法)
- poj3617贪心,易错
- 图论--Tarjan求强联通分量
- C++学习——静态成员
- 烧水问题
- I
- 记录关于微信开发中遇到的curl请求https的方法