浅析QStringr的Unicode存储特性(二)
来源:互联网 发布:阿里云 mysql 优化 编辑:程序博客网 时间:2024/05/14 09:40
浅析QStringr的Unicode存储特性(二)
来源:CSDN 作者:Love Katherine 发布时间:2007-11-5 人气:493 在上篇文章中,通过简单的实验弄清楚了QString究竟是如何以Unicode存储字符串的;
接下来考虑另一个问题, 假设"中文"的编码格式不同于locale,例如使用GBK编码,在上文的示例中,还会正常输出“中文"么? 答案是否定的。
考虑一下"中文"GBK编码时的整个转换过程
首先,"中文"对应的GBK编码为“ 0xd6,0xd0,0xce,0xc4,0x00“,由于QString默认情况下认为给定的字符串采用Latin-1编码,所以GBK编码被扩展为对应的16 bit Unicode码值“0x00d6,0x00d0,0x00ce,0x00c4,0x0000";再从QString到std::string的转换中,又由Unicode转换回Latin-1编码"0xd6,0xd0,0xce,0xe4,0x00",实际上又变回了最初的GBK编码,然而locale采用的是UTF-8编码,将GBK编码的字节流输出到编码格式为UTF-8的console,不出现乱码才见鬼呢。
那么,为什么上文中也存在相似的转换,却不会出现乱码呢?因为那里“中文"采用的就是locale编码格式,所以console能正确的识别并显示接受到的字节流。
那么,怎么正确显示GBK编码的"中文"呢?
首先,保证QString中存储的是"中文"对应的Unicode码值“0x4e2d 0x6587",而不是“0x00d6,0x00d0,0x00ce,0x00c4,0x0000",即完成GBK编码到Unicode的翻译。
其次,由于现在QString中的内容是"中文"的Unicode码值,而QString和std::string、const char *、QByteArray之间的转换在默认情况下是采用Latin-1编码,这样就会出现问题——0x4e2和0x6587这样的Unicode码值超出了Latin-1编码的表示范围,转换时会出现信息丢失;解决该问题的方式是显示调用 QString::setCodecForCStrings()来设定QString和const char *之间转换时采用的编码方法。
以下是代码片段
//GBK编码的"中文"
char chinese[]=......{0xd6,0xd0,0xce,0xc4,''};
QByteArray gbkbytearray(chinese);
QTextCodec *gbkcodec = QTextCodec::codecForName("GBK");
QTextCodec *utf8codec = QTextCodec::codecForName("UTF-8");
//设定QString与const char *之间的转换采用UTF-8编码,与locale保持一致
QTextCodec::setCodecForCStrings (utf8codec);
//此时 unicodestr中存放的是“中文"的Unicode码值
QString unicodestr=gbkcodec->toUnicode(gbkbytearray);
//同样的,可以借助QChar和GDB来查看QString unicodestr的内部的存储的值
QChar * pch=unicodestr.data();
//将QString转换为const char *并输出至console
cout<<unicodestr.toStdString().c_str()<<endl;
char chinese[]=......{0xd6,0xd0,0xce,0xc4,''};
QByteArray gbkbytearray(chinese);
QTextCodec *gbkcodec = QTextCodec::codecForName("GBK");
QTextCodec *utf8codec = QTextCodec::codecForName("UTF-8");
//设定QString与const char *之间的转换采用UTF-8编码,与locale保持一致
QTextCodec::setCodecForCStrings (utf8codec);
//此时 unicodestr中存放的是“中文"的Unicode码值
QString unicodestr=gbkcodec->toUnicode(gbkbytearray);
//同样的,可以借助QChar和GDB来查看QString unicodestr的内部的存储的值
QChar * pch=unicodestr.data();
//将QString转换为const char *并输出至console
cout<<unicodestr.toStdString().c_str()<<endl;
http://read.newbooks.com.cn/info/167108.html
- 浅析QStringr的Unicode存储特性(二)
- 浅析QStringr的Unicode存储特性(二)
- 浅析QStringr的Unicode存储特性(一)
- 浅析QStringr的Unicode存储特性
- Unicode转义的特性
- Template的特性浅析
- mysql的myisam存储引擎特性(二)
- 浅析.NET的反射特性
- 浅析.NET的反射特性
- 浅析.NET的反射特性
- 浅析一下ASCII和UNICODE的区别
- JavaScript变量存储浅析(二)
- memcached的分布式存储浅析
- Spring事务传播特性的浅析
- Innodb存储引擎的特性
- Delphi7中存储unicode的BUG?
- Delphi7中存储unicode的BUG
- 浅析Unicode编码
- 删除自身的文件
- 主题:unicode中文范围
- QT显示中文
- Nginx+Php5-fpm在Ubuntu10.04中的安装配置方法
- 通过代码学习C#&.NET——委托使用(正则表达式替换)
- 浅析QStringr的Unicode存储特性(二)
- googleADK开发环境的搭建
- BMP文件结构
- 每天一个C程序
- BSON格式解释
- 嵌入式系统 Boot Loader 技术内幕
- 更新DataTable的方法
- URL处理两个关键的函数parse_str与http_build_query
- 【Velocity】Velocity常用参考(判断为null方法...)