厦门集团网站设计公司,制作网站注册页面,开发定制手游游戏,延吉建设局网站目前字符编码有以下几种#xff1a;
1、UTF-8 UTF-8编码是Unicode字符集的一种编码方式(CEF)#xff0c;其特点是使用变长字节数(即变长码元序列、变宽码元序列)来编码。一般是1到4个字节#xff0c;当然#xff0c;也可以更长。
2、UTF-16 UTF-16是Unicode字符编码五层次…目前字符编码有以下几种
1、UTF-8 UTF-8编码是Unicode字符集的一种编码方式(CEF)其特点是使用变长字节数(即变长码元序列、变宽码元序列)来编码。一般是1到4个字节当然也可以更长。
2、UTF-16 UTF-16是Unicode字符编码五层次模型的第三层字符编码表Character Encoding Form也称为 storage format的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数即码元 长度为2 Byte的序列用于数据存储或传递。Unicode字符的码位需要1个或者2个16位长的码元来表示因此这是一个变长表示。UTF-16是2字节或4字节存储英文也是2字节。详细请参考文章
UTF-8 与 UTF-16编码详解-CSDN博客
3、GBK,GB2312
何为GBK何为GB2312与区位码有何渊源
区位码是早些年(1980)中国制定的一个编码标准如果有玩过小霸王学习机的话应该会记得有个叫做“区位”的输入法没记错的话是按F4选择。就是打四个数字然后就出来汉字了什么原理呢。请看下面的区位码表每一个字符都有对应一个编号。其中前两位为“区”后两位为“位”中文汉字的编号区号是从16开始的位号从1开始。前面的区号有一些符号、数字、字母、注音符号台、制表符、日文等等。
而GB2312编码就是基于区位码的用双字节编码表示中文和中文符号。一般编码方式是0xA0区号0xA0位号。如下表中的 “安”区位号是1618十进制那么“安”字的GB2312编码就是 0xA016 0xA018 也就是 0xB0 0xB2 。根据区位码表GB2312的汉字编码范围是0xB0A1~0xF7FE
区位码表节选 可能大家注意到了区位码里有英文和数字按道理说是不是也应该是双字节的呢。而一般情况下我们见到的英文和数字是单字节的以ASCII编码也就是说现代的GBK编码是兼容ASCII编码的。比如一个数字2对应的二进制是0x32而不是 0xA3 0xB2。那么问题来了0xA3 0xB2 又对应到什么呢还是笑。注意看了这里的跟2是不是有点不太一样确实是不一样的。这里的双字节是全角的二ASCII的2是半角的二一般输入法里的切换全角半角就是这里不同。
如果留意过早些年的手机功能机会发现人名中常见的“燊”字是打不出来的。为什么呢因为早期的区位码表里面并没有这些字也就是说早期的GB2312也是没有这些字的。到后来的GBK1995才补充了大量的汉字进去当然现在的安卓苹果应该都是GBK字库了。再看看这些补充的汉字的字节码 燊 0x9F 0xF6 。和前面说到的GB2312不同有的字的编码比 0xA0 0xA0 还小难道新补充的区位号还能是负的其实不然这次的补充只补充了计算机编码表并没有补充区位码表。也就是说区位码表并没有更新用区位码打字法还是打不出这些字而网上的反向区位码表查询也只是按照GBK的编码计算并不代表字与区位号完全对应。时代的发展区位码表早已经是进入博物馆的东西了。
Big5是与GB2312同时期的一种台湾地区繁体字的编码格式。后来GBK编码的制定把Big5用的繁体字也包含进来但编码不兼容还增加了一些其它的中文字符。细心的朋友可能还会发现台湾香港用的繁体字如KTV里的字幕跟大陆用的繁体字还有点笔画上的不一样其实这跟编码无关是字体的不同大陆一般用的是宋体楷体黑体港澳台常用的是明体鸟哥Linux私房菜用的是新細明體。GBK总体编码范围为0x8140~0xFEFE首字节在 0x81~0xFE 之间尾字节在 0x40~0xFE 之间剔除 xx7F 一条线。详细编码表可以参考这个列表。微软Windows安排给GBK的code page代码页是CP936所以有时候看到编码格式是CP936其实就是GBK的意思。2000年和2005年国家又先后两次发布了GB18030编码标准兼容GBK新增四字节的编码但比较少见。
GBK编码字符有一字节和双字节编码00–7F范围内是第一个字节和ASCII保持一致此范围内严格上说有96个文字和32个控制符号。之后的双字节中前一字节是双字节的第一位。总体上说第一字节的范围是81–FE也就是不含80和FF第二字节的一部分领域在40–7E其他领域在80–FE。
4、ANSI
用Notepad创建一个文本文件text.txt其默认编码格式为ANSI乍看之下还以为是ASCII呢输入汉字居然不是乱码 保存为test.txt发送给你美国的同事Bob。他也用Notepad不幸的是却发现你的文件内容是这样的 也许你会认为你用的是中文系统能正常显示中文他用的是英文系统不能显示中文
这么想好像很有道理呢
但是再细想一下一个系统显示乱码说明它不支持这种编码格式或者解码方式不对。难道英文系统不支持ANSI难道ANSI是一种中文编码
如果你身边有一个韩文系统也装一个Notepad默认还是ANSI编码你可以输入“한국어”发现也能正常显示 但是你要输入“汉字”可能就会发现是乱码了...
通过这个反例就可以说明ANSI不是一种中文编码。那么ANSI到底是什么编码
用十六进制编辑器打开内容为“汉字”的test.txt文件 你会发现其中baba和d7d6正好是“汉”和“字”两个字的GBK编码值。
同样用十六进制编辑器打开内容为“한국어”的test.txt文件 你会发现其中c7d1、b1b9和beee正好是“한”、“국”和“어”三个字符的EUC-KR编码值。
由此可以看出其实ANSI并不是某一种特定的字符编码而是在不同的系统中ANSI表示不同的编码。你的美国同事Bob的系统中ANSI编码其实是ASCII编码ASCII编码不能表示汉字所以汉字为乱码而你的系统中“汉字”正常显示ANSI编码其实是GBK编码而韩文系统中“한국어”正常显示ANSI编码其实是EUC-KR编码。
5、QString中的编码 QString中只存放unicode的utf16编码的字符串内部用QCharshort类型的指针进行保存。如果非要使用utf-8或ansi编码的字符串操作类可以使用QLatin1String类。也可以考虑使用QByteArray类甚至std::string。 char*变量在内存中存放的字符串默认编码与编译器参数 execution-charset有关而vs2015及以下编译器默认为 /execution-charsetGB2312也就是char*变量内存中保存时使用ansi(具体为GB2312)编码vs2022默认为 /execution-charsetUTF-8gcc或类gcc编译器默认为 -fexec-charsetUTF-8特就是char*使用unicode的utf8编码。可以通过在字符串前加u8强制编译器对某个char*变量在内存中保存时采用unicode的utf8编码。 char*转换成QString一定会做一次字符编码的转码通过QString(const char*)构造的QString对象char*字符串会被QString强制当成unicode的 utf8编码这是QString代码不可更改的并隐式的将这个强制当做unicode 的utf8编码的字符串转换成unicode的utf16编码的字符串。vs编译器 的 execution-charset 默认 为ansi编码存放的编码为ansi编码如果你qt工程采用vs2015编译器或以下编译器这时候强制当做unicode的utf8转换成QString就一定会乱码所以这个时候最好设置/execution-charsetUTF-8的编译器参数。QString 官方不建议使用从char*转QString的构造函数。所以在这个构造函数前加了QT_ASCII_CAST_WARN 宏开关和宏提示。QString中所有的从char*转换到QString的构造函数 或者 由char*隐式转换到QString的函数 或者 参数中含有char*的非static函数 都是隐式调用QString::fromUtf8(char*) 这个静态函数 进行字符编码的转换的。从QByteArray转QString 与 char*转QString 是一样也会出现同样的问题。
从char*转到QString QString有提供很多的static类型的转码函数qt建议通过调用这些函数进行显示的编码转换。
D:\Qt\Qt5.12.0\5.12.0\mingw73_64\include\QtCore\qstring.h static inline QString fromLatin1(const QByteArray str)//从ascii编码转unicode的utf16编码 { return str.isNull() ? QString() : fromLatin1(str.data(), qstrnlen(str.constData(), str.size())); } static inline QString fromUtf8(const QByteArray str) //从unicode8的编码转换成unicode的utf16编码 { return str.isNull() ? QString() : fromUtf8(str.data(), qstrnlen(str.constData(), str.size())); } static inline QString fromLocal8Bit(const QByteArray str) //从local编码转换虫unicode的utf16编码 { return str.isNull() ? QString() : fromLocal8Bit(str.data(), qstrnlen(str.constData(), str.size())); } static QString fromUtf16(const ushort *, int size -1); //从unicode的utf16编码转unicode的utf16编码可以在字符串前存放BOM来指定输入的字符串字节序否则采用系统默认字节序 static QString fromUcs4(const uint *, int size -1); //从unicode的utf32编码转unicode的utf16编码,可以在字符串前存放BOM来指定输入的字符串字节序否则采用系统默认字节序 #if defined(Q_COMPILER_UNICODE_STRINGS) static QString fromUtf16(const char16_t *str, int size -1) { return fromUtf16(reinterpret_castconst ushort *(str), size); } static QString fromUcs4(const char32_t *str, int size -1) { return fromUcs4(reinterpret_castconst uint *(str), size); } #endif QString::fromUtf8(char*) 转码失败是不会给提示的但是会将不认识的字节 转成 0xfffd。 如果你将ansi编码的字符串传入 比如ansi编码的 你好 传入其ansiGB2312编码为0xC4E3 0xBAC3 会得到由四个0xfffd的QChar组成的QString。
下面的案例中使用windows下qt5.12vs2015编译器的场景采用默认的excution-charset默认值为GB2312)和source-charset(默认值为GB2312)编译器参数源文件编码为带BOM的utf8vs编译器能通过BOM识别到文件为utf8编码并自动将source-charset设置为utf8编码QTextCodec为 system编码在我电脑上也就是ansi(GB2312)excution-charset为默认的ansi(GB2312)编码。
代码中QString类型的str1和str2都存在隐式地将ansi编码的字符串通过fromutf8() 转变成utf16编码的字符串utf8并不识别ansi编码的字符串存在转码错误且刚好你好中的每个字节在utf8中都是非法的导致char数组变量中的每个字节都变成值为0xfffd的占两个字节的QChar类型数据。 当然主要问题还是qt中可能存在大量隐式的将char*赋予QString的地方。比如我们常用的qDebug中就有。各种使用char*的地方都可能存在隐式的将chai*转QString而存在字符编码转码的隐患 测试代码 int main(int argc, char *argv[]) { char cstr1[]你好c1; char cstr2[]u8你好c2; wchar_t cstr3[]L你好c3; QString str1(你好1); //存在隐式地将gb2312转换成unicode的utf16 QString str2; str2你好2; //存在隐式地将gb2312转换成unicode的utf16 qDebug()你好endl; //qDebug内部存在隐式的将gb2312转换成unicode的utf16 //显示将gb2312转QString所需的utf16。qt推荐的用法。 QString str3QString::fromLocal8Bit(你好3); //显示将Utf8转QString所需的utf16。qt推荐的用法。 QString str4QString::fromUtf8(u8你好4); QString str5QString::fromLocal8Bit(cstr1); QString str6QString::fromUtf8(cstr2); ushort buffer1[6]{}; ushort buffer2[6]{}; ushort buffer3[6]{}; ushort buffer4[6]{}; memcpy(buffer1,str1.data(),str1.length()*2); memcpy(buffer2,str2.data(),str2.length()*2); memcpy(buffer3,str3.data(),str3.length()*2); memcpy(buffer4,str4.data(),str4.length()*2); //设置控制台接收ansi(gb2312)编码的字符串。936是windows中GB2312字符编码的代码。 system(chcp 936); coutcstr1endl; qDebug().noquote()str1; qDebug().noquote()str2; qDebug().noquote()str3; qDebug().noquote()str4; qDebug().noquote()str5; qDebug().noquote()str6; return 0; } ———————————————— 版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。 原文链接https://blog.csdn.net/qiushangren/article/details/136617718 ———————————————— 版权声明本文为博主原创文章遵循 CC 4.0 BY-NC-SA 版权协议转载请附上原文出处链接和本声明。 原文链接https://blog.csdn.net/jackgo73/article/details/130225319
同一个编码文件里怎么区分ASCII和中文编码呢从ASCII表我们知道标准ASCII只有128个字符0~127即0x00~0x7F0111 1111。所以区分的方法就是高字节的最高位为0则为ASCII为1则为中文。 笔者之前写过utf-8的博客【点击】 ———————————————— 版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。 原文链接https://blog.csdn.net/hherima/article/details/50801360 文章转载自: http://www.morning.klcdt.cn.gov.cn.klcdt.cn http://www.morning.mtrz.cn.gov.cn.mtrz.cn http://www.morning.bpp999.com.gov.cn.bpp999.com http://www.morning.pxdgy.cn.gov.cn.pxdgy.cn http://www.morning.ctrkh.cn.gov.cn.ctrkh.cn http://www.morning.rckdq.cn.gov.cn.rckdq.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn http://www.morning.pmtky.cn.gov.cn.pmtky.cn http://www.morning.xhjjs.cn.gov.cn.xhjjs.cn http://www.morning.mfrb.cn.gov.cn.mfrb.cn http://www.morning.bbgr.cn.gov.cn.bbgr.cn http://www.morning.bpwfr.cn.gov.cn.bpwfr.cn http://www.morning.cyyhy.cn.gov.cn.cyyhy.cn http://www.morning.jxcwn.cn.gov.cn.jxcwn.cn http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.yghlr.cn.gov.cn.yghlr.cn http://www.morning.mrcpy.cn.gov.cn.mrcpy.cn http://www.morning.rynqh.cn.gov.cn.rynqh.cn http://www.morning.jwlmm.cn.gov.cn.jwlmm.cn http://www.morning.splcc.cn.gov.cn.splcc.cn http://www.morning.qllcm.cn.gov.cn.qllcm.cn http://www.morning.qlxgc.cn.gov.cn.qlxgc.cn http://www.morning.xhlpn.cn.gov.cn.xhlpn.cn http://www.morning.cykqg.cn.gov.cn.cykqg.cn http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn http://www.morning.qmbgb.cn.gov.cn.qmbgb.cn http://www.morning.mlcnh.cn.gov.cn.mlcnh.cn http://www.morning.syqtt.cn.gov.cn.syqtt.cn http://www.morning.bnzjx.cn.gov.cn.bnzjx.cn http://www.morning.mypxm.com.gov.cn.mypxm.com http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn http://www.morning.ummpdl.cn.gov.cn.ummpdl.cn http://www.morning.xmwdt.cn.gov.cn.xmwdt.cn http://www.morning.pabxcp.com.gov.cn.pabxcp.com http://www.morning.mprpx.cn.gov.cn.mprpx.cn http://www.morning.pnjsl.cn.gov.cn.pnjsl.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.qgjp.cn.gov.cn.qgjp.cn http://www.morning.xuejitest.com.gov.cn.xuejitest.com http://www.morning.rccbt.cn.gov.cn.rccbt.cn http://www.morning.wfspn.cn.gov.cn.wfspn.cn http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.hkchp.cn.gov.cn.hkchp.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.xckqs.cn.gov.cn.xckqs.cn http://www.morning.mooncore.cn.gov.cn.mooncore.cn http://www.morning.mhlsx.cn.gov.cn.mhlsx.cn http://www.morning.zwckz.cn.gov.cn.zwckz.cn http://www.morning.zymgs.cn.gov.cn.zymgs.cn http://www.morning.zylzk.cn.gov.cn.zylzk.cn http://www.morning.zcqgf.cn.gov.cn.zcqgf.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.gzttoyp.com.gov.cn.gzttoyp.com http://www.morning.hqrr.cn.gov.cn.hqrr.cn http://www.morning.kdlzz.cn.gov.cn.kdlzz.cn http://www.morning.wdply.cn.gov.cn.wdply.cn http://www.morning.twhgn.cn.gov.cn.twhgn.cn http://www.morning.mjglk.cn.gov.cn.mjglk.cn http://www.morning.ie-comm.com.gov.cn.ie-comm.com http://www.morning.lxmmx.cn.gov.cn.lxmmx.cn http://www.morning.xcszl.cn.gov.cn.xcszl.cn http://www.morning.sgrwd.cn.gov.cn.sgrwd.cn http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn http://www.morning.ldzss.cn.gov.cn.ldzss.cn http://www.morning.txqsm.cn.gov.cn.txqsm.cn http://www.morning.pxwjp.cn.gov.cn.pxwjp.cn http://www.morning.gdljq.cn.gov.cn.gdljq.cn http://www.morning.gmswp.cn.gov.cn.gmswp.cn http://www.morning.rpkl.cn.gov.cn.rpkl.cn http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.nsrlb.cn.gov.cn.nsrlb.cn http://www.morning.lhwlp.cn.gov.cn.lhwlp.cn http://www.morning.tsnmt.cn.gov.cn.tsnmt.cn http://www.morning.xymkm.cn.gov.cn.xymkm.cn http://www.morning.hrtfz.cn.gov.cn.hrtfz.cn http://www.morning.snrhg.cn.gov.cn.snrhg.cn http://www.morning.jokesm.com.gov.cn.jokesm.com http://www.morning.mnqz.cn.gov.cn.mnqz.cn