编码问题(QT、C++)

/***********************************************************************
 * 编译器:minGw、MSVC、clong。linux下utf8编码是无BOM头的,windows下utf8下是带有BOM头的。(windows下设置加BOM、用c++11优化的加u8)
 * QT、C++中编码问题
 *      源码字符集:源码文件是使用何种编码保存的
 *      执行字符集:程序执行时内存中字符串编码
 * 0.C++98:未规定源码字符集,未规定执行字符集
 * 要跨平台,这两个字符集必须都是"确定"的.如果都为utf-8,那就天下太平了.
 * 源码保存成utf-8没什么困难,但执行字符集需要时utf-8,就有些困难:
 * 1.对GCC来说,这个问题很简单(默认的编码选项)
 *      GCC下两个都可以根据自己的喜好编码(如不指定,默认都是utf-8)
 *      编码文件保存成utf8即可(带或不带BOM均可)早期gcc不支持带BOM的utf8源码文件,GCC4.6以后就支持了。
 * 2.对MSCV来说,这个问题异常复杂:
 *      源码字符集:有BOM则按BOM解释,无则使用本地Locale字符集(随系统设置而变)
 *      执行字符集:使用本地locale字符集(随系统设置而变)
 *      宽执行字符集:...
 *   直到MSVC2010sp1:源码保存成带BOM的utf8,utf16,然后添加
 *      #if _MSC_VER >= 1600
 *      #pragma execution_character_set("utf-8")
 *      #endif
 * 3.要想跨GCC4.6+和MSVC2010sp1+,我们需要取它们的交集:
 *      源码保存成带BOM的utf8
 *      为MSVC添加#pragma
 *
 * C++11:MSVC支持C++11的String Literal后,就可以不用pragma。直接:char str[] = u8"程序员狗蛋";
 * C++11为“执行字符集”所做的努力,规定了utf8、utf16和utf32这三种的执行字符集:
 *      char* 		: u8"中文"
 *      char16_t*	: u"中文"
 *      char32_t*	:U"中文"
 * 可是C++11并没有规定源码字符集。C++标准对编译器:不管这个文件具体编码是什么,但必须生成对应utf8编码的字节流,对此:
 * MSVC:源码文件必须有BOM,不然就认为是本地locale编码
 * GCC:默认是utf8编码,除非通过命令行通知是其他编码
 * 在C++11标准下,对源码编码简单的处理办法:使用带BOM的UTF8保存。
 *
 * //
 *   gb18030字符集兼容了gbk字符集,以两个字节表示一个文字。windows系统可能使用的就是这两种的一种。
 *   unicode字符集以2个或以上的字节表示一个汉字。
 *   通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。
 *   utf8字符集以2个或以上的字节表示一个汉字。实际上具体的数值和unicode有很大的相关性。
 *   ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF。亦称为Latin1。
 *
 *   QString内部可能是使用unicode字符集来存储文字。具体输出的时候,就可以输出该文字对应的unicode, ucs4, utf8, gb18030的编码。
 *   使用qtcreator创建main.cpp,它默认代码里的汉字使用utf8字符集。不要使用msvc编译器,因为它默认汉字使用gb18030字符集
 *
 *   #include <QCoreApplication>
 *   #include <QDebug>
 *   int main(int argc, char *argv[])
 *   {
 *       QCoreApplication a(argc, argv);
 *       QString tmp="汉字";
 *       qDebug() << "tmp=" << tmp << endl;
 *       qDebug() << "toUtf8" << tmp.toUtf8() << endl;       //返回utf8编码的一串数字
 *       qDebug() << "toLatin1" << tmp.toLatin1() << endl;   //"汉字"不在latin1字符集中,所以结果无意义
 *       char *p = new char[1+strlen(tmp.toLatin1().data())];
 *       strcpy(p, tmp.toLatin1().data());
 *       for (int i=0; p[i] != '\0'; i++)
 *       {
 *           printf("0x%02x ", p[i]);
 *       }
 *       printf("\n");
 *       delete p;
 *       qDebug() << "toLocal8bit" << tmp.toLocal8Bit() << endl;//返回windows操作系统设置的字符集gb18030的编码
 *       qDebug() << "toUcs4" << tmp.toUcs4() << endl;           //返回ucs4编码组成的QVector,一个汉字占用4字节
 *       return a.exec();
 *   }
 * 有兴趣的猿们可持续关注 ”程序员狗蛋“ 为大家陆陆续续做出的分享,也可以共同交流进步。
 *  狗蛋链接:
 *   博客园:http://www.cnblogs.com/zll-gd/
 *   CSDN:http://blog.csdn.net/oboluochuixue12
 *  ... ... ...
 ***********************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

利哥AI实例探险

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值