语言编码(ACSII unicod UTF-8)、QT输出中文乱码深入解析

总结:

《码农周刊》由于微博微信账号 developerWorks 创建。developerWorks 一直留心于IT技术干货分享,目前粉丝曾逾7万。

1.
qt输出中文乱码原因分析

网页版 | 疾订阅《码农周刊》

qt的编程环境默认是utf-8编码格式(有关编码见下文知识要一);

次第设计

cout << "中文" << endl;

[译] Lambda
架构剖析(伍昆)  

程序运行,程序并无识ANSI,UTF-8以及其它其它编码.系统只懂处理你被她的字符的**次迈入制表示.**

Sourcegraph 架构设计 (Quinn
Slack)
 

 

编程语言

有关  “中””文”
的3栽编码二进制内容:

C 语言编程基础 (Marshall
Brain)  

 

[译] 不要急于求成切换到 Java 8 的 6
个原因(@Java译站)
 

ANSI(GBK): 0xd6d0  0xcec4

objc.io 第 14

 

 

Swift 语言指南
(@SwiftLanguage)
 

UTF-8: 0xe4b8ad 0xe69687

Dropbox 如何以 C++ 进行 iOS 与 Android 的跨平台开发 (Ole
Begemann)
 

 

Python
编程中之反倒模式(曹知渊)
 

Unicode: 0x4e2d 0x6587

JavaScript
在线交互教程
 

1)在简体中文Windows下之控制台显示环境是ANSI编码(代码页936,
GBK),先明确这点.

Golang
副高并发场景的原因剖析(@蝈蝈俊)
 

第一区别,MinGW看到底是”0xe4b8ad”和”0xe69687″(gcc默认UTF-8).注意,用MinGW编译的源文件中出中文宽字符必须保留也UTF-8编码.

Scala
学习资源合集

2)测试代码:

工具资料

#include <iostream>
using namespace std;

int main()
{
    char a[] = "中文";
    cout << a << endl;
    return 0;
}

Git
教程(@廖雪峰)  

3)经在qt5.8中测试乱码;

进程中共同享 inode
相互影响简单解析(@bryton岁月)
 

解析:参见(下文知识要点一,知识要点二)不难察觉UTF-8只是同种植编码实行方案,并无是实际上编码;再参见(文化而点五),程序运行是能过最后编译完成的二进制码输出

杭 JS 2014
演讲视频合集
 

每当vs2017丁,用unicode编码方式,编译运行输出正常;原因我眷恋大好掌握了,当次编译后保存的凡“中文”unicode二进制编码,而控制高出口时CodePage
(GBK 936)
这个CodePage就见面根据映射表去挨家挨户对诺GBK中的中文字,再展开输出;

系统管理员视频网站
 

假如以qt5.8(MinGW)中,输出则是乱码;因为qt5.8默认的编码方式是UTF-8;当次编译后保存的是“中文”UTF-8次之上前制编码,而决定高出口时CodePage
(GBK 936)
这个CodePage就会见因映射表去挨家挨户对承诺GBK中的中文字,好像哪里不对,好了,问题即生当此刻了,CodePage是每同unicode的映射表,并无是跟UTF-8的(知而点二CodePage),在qt5.8(MinGW)中,原程被编译二进制文件,保存下去的“中文”地址是,UTF-8编码,而映射表是在unicode中寻找内容,再开展输出,自然就是乱码;

[PDF][译] 给开发者的终极 XSS 防护备忘录
(@CnFooying)
 

网上解决措施1.修改注册表CodePage 65001  经测试或乱码

[PDF] Sibyl – 来自 Google
的普遍机器上体系
 

答辩分析:CodePage(GBK
936)找不交投,那么把控制台换成UTF-8;那么然先保存之,UTF-8华语,再经UTF-8对承诺的汉字码,不就是可知出口汉字;理论类中,但在自己的win7
64个中文系统上,qt5.8,vs2017全都失败;

Centurion – New Relic 开源之 Docker
部署工具
 

可能原因:我系统中cmd控制台并无支持UTF-8编码方式(有机遇以win10被测试后再举行补充)

GitHub for
Mac
 

化解方法2:通过(知识点一,二,
五),总结,当要在决定高进行中文输出时,编码方式应该保留也unicode,或ACSI(GBK);

Docker
资料集萃
 

4)关于宽字节出口乱码的问题;

Material Design
中文版
 

出口宽字节汉语(详见知要点四):例

[PDF] 树莓派杂志《MagPi》第 25

 

#include <iostream>
using namespace std;

int main()
{
    wcout << L"中文" << endl;
    return 0;
}

每周一开

出口则使用wcout而非可知是cout;关于宽字符详见;知识而点二后续,**知要点三**

《大教堂和庙》  

于vs2017被,输出中文,为空;

《大教堂和庙》在开源走中之身份相当给基督教之佛经,用黑客们的语说,这是“黑客藏经阁”的第一藏。Kindle
电子书

1、cout和wcout

编程之外

 在C++下,cout可以一直出口中文,但对wcout却特别。对于wcout,需要拿其locale设为地面语言才会出口中文:

[视频]
让程序员抓狂:需求是这么制定出来的  

 wcout.imbue(locale(locale(),””,LC_CTYPE));

说招人的事情(胖胡斐)
 

 也有人用而下语句子之,但随即会变动wcout的具有locale设置,比如数字“1234”会输出为“1,234”。

乃怎么爱烹饪?(@知乎)
 

 wcout.imbue(locale(“”));

Geek 周边

 在C语言下,locale设置为当地语言(C语言中只有全局locale)就好健康输出了:

Cherry G80-3000 –
小樱桃家的外来舰键盘  

 setlocale(LC_CTYPE, “”);

G80-3000 系列键盘是 Cherry
机械键盘的主力产品。标准的键位设计、出类拔萃的做工、缜密入微的底细处理,这些德国工业产品所固有的性状令这款表朴实的键盘处处显露着奢华内涵。

 在qt5.8(MinGW)环境面临,以上并无实用,目前尚并未找到出口中文的点子,未完待续;

干活机遇

 

[广州]
伊的家  

知要一:编码**

尖端 PHP 开发工程师(15-30k) 中级 PHP 开发工程师(7-14k) HTML5
开发工程师(10-20k)

ASCII:
早期的字符集,7各类,128个字符,包括大小写a-z字母,0-9数字和一些控制字符.

[杭州]
大搜车  

  扩展ASCII: 1单字节8位,只所以7号非合理.于是第8号用于扩大ASCII字符集,这样就算以基本上矣128个字符.于是用正在后128单字符来扩充表示只要拉丁字母,希腊字母等特殊符号.但问题是欧洲那么同样票国家多互为都有所不相同的突出字母,一起塞进后128只引人注目不够,于是代码页出现了.

Android 工程师(10-15k) iOS 工程师(10-15k) Java
工程师(8-16k) 测试工程师(7-14k) 前端工程师(可实习)(8-16k)

**  Code Page(代码页)**:
1单字节前128只字符大家集合与ASCII一样,而后128独字符,根据不同体系所谓代码页来分各个语言不等同的字母和符号.

[北京]
大鱼  

**  DBCS(夹许节字符集)**:
对于亚洲国家,后128个字符依然无法包含大量底象形文字,DBCS正是为之之一个解决方案.DBCS由一个要么有限独字节表示一个字符,这说明DBCS并不一定是零星单字节,对于如果英文字母,是往ASCII兼容的,依然由1独字节表示,而于要中文则就此2个字节表示.英文和国文好统一地拍卖,而别是否也中文编码的章程是2独字节中的高字节的首各也1,就务须检查后紧跟着的老大字节,2只字节一起说为1独字符.GB2312,GBK到GB18030都属DBCS.另外,简体中文Windows下之ANSI编码通常是借助GBK(代码页936).

Rails 工程师(8-20k) iOS 工程师(12-20k) Android
工程师(12-20k) 前端工程师(8-20k)

DBCS很死题材在字符串的字符数不克由此字节数来控制,如”中文abc”,字符数是5,而字节数是7.于用++或–运算符来举历字符串的程序员来说,这简直就是噩梦!

[杭州]
阿里巴巴  

  Unicode: 学名为”Universal Multiple-Octet
Coded Character Set
“,简称”UCS“.UCS可以看做是”Unicode Character
Set”的缩写.

Java 高级开发工程师(15-30k)

啊是同一种字符集/字符编码方法,它统一用唯一的字符集来含有这个星球上大部分语言的开系统.UCS向ASCII兼容(即眼前128单字符是平等的),但并无匹配DBCS,因为任何字符在UCS中让再次编码(重新配置职务).

[南京]
孢子社区  

UCS有有限种植格式:UCS-2和UCS-4.前者用2独字节(16号)编码,后者用4个字节(实际上只是所以31各项)编码.USC-4前2单字节都为0的一对号称BMP(基本多语言平面),就是说BMP去丢前2个零字节就是UCS-2.目前之UCS-4规范中还未曾任何字符被分配在BMP之外.(说白了,USC-4就是也当16各项之USC-2都受分配殆尽时候召开重新做扩展用的,现在尚并未动)

全端工程师

  UTF-8,UTF-16,UTF-32: “Unicode transformation
format”(UTF)
 ,即Unicode的传导格式.Unicode规定了怎么编码字符,而UTF规定怎么用一个Unicode字符单元映射到配节序来导或保存.

[北京]
深思洛克软件技术股份有限公司  

UTF-16UTF-32个别表示因16位和32号也一个Unicode单元进行编码,其实UTF-16对承诺不怕是UCS-2,UTF-32对许就是UCS-4(UCS-2以及UCS-4是旧的传教,应捐弃).
另外,通常说之Unicode就是依UTF-16.

Windows C/C++ 程序员(8-15k) Java 程序员(8-15k)

UTF-8是关键!如果统一Unicode都因此2字节表示,英文字母觉得自己不怕特别吃亏(高字节始终是0字节).UTF-8提供了同等种植灵活的解决办法:以单字节(8bit)作为编码单元,变长多字节编码方式.如ASCII字母继续使用1字节储存,中文汉字用3字节囤积,其他最多但直6配节.

[广州]
向日葵保险网  

UTF-16以及UTF-32需要发配节序标志BOM(FEFF)解决大端小端问题.UTF-8没有许节序的题材(因为坐1个字节为单元).

系统架构师(12-20k) 高级 Java 工程师(8-16k) 高级 Rails
开发工程师(8-16k) 运维经理 高级运维工程师(5-10k) 高级前端开发工程师 Web
前端开发主管

 

双重多工作时  

===============================================================================

在招人?欢迎将招聘启事发送到 job@manong.io

另外注意点:

《码农周刊》出于微博微信账号 developerWorks 创建。developerWorks 一直小心于IT技术干货分享,目前粉丝已经超越7万。

DBCS准确说,应该是MBCS(Multi-Byte Chactacter
System, 多字节字符系统).

网页版 | 迅速订阅《码农周刊》

字符集(Charset)和编码(Encoding)注意区别.如GBK,GB2312以及Unicode都既是字符集,也是编码方式,而UTF-8只是编码方式,并无是字符集.

Linux下The GUN
C Library(从glibc
2.2初始)中宽字符wchar_t是坐32个之Unicode(USC-4)表示.如松字符”中”字呢
“0x00004e2d”.而Windows下之CRT使用宽字符仍是16号的.

 

知识而点二:关于Unicode的咀嚼(加深对编码的掌握)

析Unicode和UTF-8 

如出一辙、首先说明一下今常用的有的编码方案:
1.
当华,大陆最常用之尽管是GBK18030编码,除此之外还有GBK,GB2312,这几乎独编码的关联是这样的。
最为早制定的汉字编码是GB2312,包括6763个字和682个其他符号
95年更修订了编码,命名GBK1.0,共圈定了21886个号。
从此又出了GBK18030编码,共录取了27484个字,同时还用了藏文、蒙文、维吾尔文等重大的少数民族文字,现在WINDOWS平台必待支持GBK18030编码。
本GBK18030、GBK、GB2312的各个,3栽编码是向下兼容,同一个汉字在三单编码方案中凡平等之编码。
2.  台湾,香港顶地采用的是BIG5编码
3.  日本:SJIS编码
二、Unicode
  如果把各种文字编码形容呢各地之白,那么Unicode就是世界每合作开发的同栽语言。
  于这种语言环境下,不见面重新来语言的编码冲突,在同屏下,可以展示另外语言的内容,这虽是Unicode的太特别益处。
  那么Unicode是如何编码的吧?其实非常简单。
  就是拿世界上富有的仿用2个字节统一开展编码。可能你见面问,2只字节最多会代表65536独编码,够用吧?
  韩国暨日本之大多数中国字都是于中国传播过去的,字型是截然相同的。
  比如:“文”字,GBK和SJIS中都是与一个中国字,只是编码不同而已。
  那样,像这么合编码,2只字节就已经够用容纳世界上有着的言语的大部仿了。
UCS-2 与UCS-4
  Unicode的学名是”Universal Multiple-Octet Coded Character
Set”,简称为UCS。
  现在所以底是UCS-2,即2独字节编码,而UCS-4是以防范以来2单字节不敷用才开之。UCS-2也称基本多文种平面。
  UCS-2转换到UCS-4只是简单的在前面加2个字节0。
  UCS-4则要用来保存辅助平面,例如Unicode 4.0遭到之第二助平面
  20000-20FFF – 21000-21FFF – 22000-22FFF – 23000-23FFF – 24000-24FFF

  • 25000-25FFF –   26000-26FFF   - 27000-27FFF – 28000-28FFF –
    29000-29FFF – 2A000-2AFFF – 2F000-2FFFF
      总共加了16独援平面,由原的65536个编码扩展至邻近100万编码。
    三、 兼容codepage
      那么既统一了编码,如何配合原先各之契编码为?
      这个上即便得codepage了。
      什么是codepage?codepage就是各国的字编码和Unicode之间的映射表。
      比如简体中文和Unicode的映射表就是CP936,点这里查看官的映射表。
      以下是几乎单常因此之codepage,相应的改动点的地方的数字即可。
      codepage=936 简体中文GBK
      codepage=950 繁体中文BIG5
      codepage=437 美国/加拿大英语
      codepage=932 日文
      codepage=949 韩文
      codepage=866 俄文
      codepage=65001 unicode UFT-8
    最后一个65001,据个人了解,应该只有是一个虚拟的映射表,实际只是一个算法而已。
    从今936被自由取一尽,例如:
    0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
    面前的编码是GBK的编码,后面的凡Unicode。
    经过查看就张表,就能够大概的兑现GBK和Unicode之间的换。
    四、UTF-8
      现在明了Unicode,那么UTF-8又是呀吧?又胡会现出UTF-8呢?
      ASCII转换成为UCS-2,只是在编码前插入一个0x0。用这些编码,会连一些控制符,比如
    ” 或
    ‘/’,这当UNIX和组成部分C函数中,将见面起严重错误。因此得以一定,UCS-2不称当Unicode的外表编码。
      因此,才落地了UTF-8。那么UTF-8是哪编码的?又是安化解UCS-2的题目为?
    例:
    E4 BD A0        11100100 10111101
    10100000
    这是“你”字的UTF-8编码
    4F 60          01001111
    01100000
    这是“你”的Unicode编码
    至于汉字按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
    将除了x以外的数字拼接在联名,就成为“你”的Unicode编码了。
    小心UTF-8的极其前方3个1,表示整个UTF-8错是由于3只字节构成的。
    透过UTF-8编码之后,再也不会出现敏感字符了,因为高位老为1。
    以下是Unicode和UTF-8之间的换关系表:
    U-00000000 – U-0000007F: 0xxxxxxx
    U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
    U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
    U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    10xxxxxx、
    Unicode编码转换到UTF-8,针对汉语,简单的将Unicode字节流套到x中便改为UTF-8了。

续篇:

unicode以windows api中的使
    实际上,常涉及的Win32
API的称呼并无是它们的忠实名称。这些名仅仅是片巨,你可当PSDK的条文件中找到这些宏对用之函数名称。所以,如果PSDK的文档提到一个函数,如CreateFile,开发人员应该发现及它不过是一个特大。它的忠实名称是CreateFileA和CreateFileW。是的,它表示了“两只”函数名叫,而无是一个,是跟一个函数在不同Win32函数的个别只例外之本。以’A’结尾的函数接受ANSI字符串(char *),即Unicode字符串(wchar_t
*)而于vs中可为此WCHAR宏代替,即wchar_ts型字符串。两栽版本的函数都以模块kernel32.dll中贯彻,如果您的编程环境是Unicode则,则宏CreateFile在编译是会为CreateFileW代替,否则用CreateFileA代替。

PSDK的字符串解决方案:TCHARs
   
为了避免为歧之windows操作系统开发不同版本的PSDK,微软制定了一个统一的字符串类型TCHARs。TCHAR以及其它的照应的宏在头文件WinNT.h中有定义。程序员在次中莫待也使用char还是wchar_t而纠结,只需要利用宏TCHAR就足以了。根据Unicode环境是否有,编译器会活动进行相应的变换。同样道理,程序员不需为用’A’还是’W’型Win32
API函数纠结。

对比较前期的体系都运用ACSI编码,而以风靡系统中尽管还合并啊unicode编码(如:手机系统)

 

文化而点三:
L”……”,
_T(), _TEXT
,TEXT()

L”……”: L是意味字符串资源转为宽字符的保存(通常转为unicode),却不一定是unicode字符,这与编译器实现相关。

_T(” ……”) 是一个适配的宏     #ifdef _UNICODE(当系统环境是unicod下)
_T就是L   而当系统环境是ACSI 
_T就是ANSI的。(有便民早期windows系编程文件的移植,达到新老体系相互)

_T、_TEXT、TEXT 三者效果一样

tchar.h是运作时的头文件,_T、_TEXT 根据_UNICODE来确定宏
winnt.h是Win的条文件依据,TEXT 根据UNICODE 来确定宏

若是用而利用就3单大,则需要同时定义 UNICODE 和 _UNICODE
VS2010过后的本子中
,设置:项目–属性–配置属性–常规–字符集–使用Unicode字符集,
那么编译器命令选项中的确同时进入了_UNICODE和UNICODE。

知而点四: c++ 的cout 与
wcout**

cout << "hello world!" << endl; //ACSI 编码输出

cout << L“hello world!” <<endl;// unicode 输出

当输出双配节编码到控制台时,cout输出的以凡地方而毫不内容这时就要用到wcout;

改为:

cout << "hello world!" << endl; //ACSI 编码输出

wcout << L“hello world!” <<endl;// unicode 输出

** 


知要点五:编译连接过程

1.预处理 生成.i文件

C++的事先处理是凭借当C++程序源代码被编译之前,由预处理器对C++程序源代码进行的处理。这个历程并无对准先后的源代码进行分析。

此的预处理器(preprocessor)是凭真的的编译开始之前由于编译器调用的一个独立程序。

事先处理器主要负责以下的几乎处于

1.宏的替换

2.去除注释

3.处理预处理指令,如#include,#ifdef

 2.编译和优化 生成汇编.s原文件

词法分析 — 识别单词,确认词类;比如int
i;知道int是一个列,i是一个首要字与判断i的讳是否合法
语法分析 — 识别短语和句型的语法属性;

语义分析 — 确认单词、短语和句型的语义特征;

代码优化 — 修辞、文本编辑;

代码生成 — 生成译文。

3.生成**.o**靶文件


汇编过程实际上指将汇编语言代码翻译成靶子机器指令的长河。

在结尾的靶子文件被

除此之外有着和谐的多寡及二进制代码之外,还要至少提供2单说明:未缓解符号表和导出符号表,分别报告链接器自己需要什么以及能够提供什么。

编译器把一个cpp编译为目标文件之时节,除了如当对象文件里写副cpp里富含的数额与代码,还要至少提供3独说明:未缓解符号表,导出符号表和地址重定向表。
不缓解符号表提供了所有在拖欠编译单元里引用但是定义并无以本编译单元里之记号及其出现的地点。
导出符号表提供了本编译单元有定义,并且愿意提供于另外编译单元使用的号及其地址。
地方重定向表提供了本编译单元有对自地址之援的记录。

4.链接

出于汇编程序生成的靶子文件并无能够立即就给实施,其中可能还有为数不少不曾缓解之问题。例如,某个源文件被的函数可能引用了其它一个来源文件中定义的某某符号(如变量或者函数调用等);在程序中可能调用了某库文件被的函数,等等。所有的这些题材,都亟需通过链接程序的处理着会得化解。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图