小寒二候:山茶处处春犹浅

by admin on 2018年10月5日

总结:

山茶科的科名是Theaceae,但茶属Thea就并入山茶属Camellia,不复存在了。这种“科名与科里其它一个属于的属名都没什么”的事态,在植物分类学上是雅少见的。本来确实该用Theaceae改为Camelliaceae,但漫漫的利用习惯,使它们可以保留这个源自中华闽南语的科名。于是中国烙印,永久地从在了马上同科的植物上。

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

山茶,山茶科山茶属植物。

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

一多文人说:闻“喝茶是安身立命的最低标准”,这也是大多数华夏人数的存标配。民间传说讲神农尝百拟时因茶解毒,称其为“查”,后改变写吧“茶”;《本草纲目》记载“其叶类茗,又可作饮,故得茶名”。这些都是茶的机要作用。而茶花,那时候还是陪衬。

cout << "中文" << endl;

中国自唐朝初始选育栽培山茶,但现在跳20000独品种的茶花中,绝大多数凡当代在欧美、日本育成,曾经的盛唐是呈现无至之。我常常感到万分不满,那些极端好之诗人,竟从未会受到见这些最得意的茶花,我们也因这去了有太得意的诗篇。

程序运行,程序并无认识ANSI,UTF-8以及另其它编码.系统只略知一二处理你让其的字符的**第二进制表示.**

当下的茶花多吧今日Theaceae科的科长,开单瓣红花的山茶*Camellia
japonica*。虽然项目单一,又无香味,但为冬雪未直的时节就开了,天地一片枯槁中,只有白雪映着红花,也于生雷同栽独到的文明礼貌。苏轼说其“烂红如火雪中起”,艳若未精;贺铸说是“玲珑残雪渐渐山茶”,又显娇俏。

 

南宋画家林椿的《山茶霁雪》扇面画

关于  “中””文”
的3种编码二进制内容:

南宋时,栽培以及观赏山茶已成风。在树过程被,人们发现山茶的花期很丰富。养得好的讲话,可以由冬到下一直开到次年三月,花期长齐150龙,大大出乎了“花无百日红”的限期。

 

然的活力是生招人喜欢的。陆放翁就当花园里见到“山茶一造,自冬至清明后,著花不已”,因此写下两篇绝句——

ANSI(GBK): 0xd6d0  0xcec4

东园三月暴雨兼风,桃李飘零扫地空。唯有山茶偏耐久,绿丛又放数枝红。

洗里开始花到春晚,世间耐久孰如王。凭栏叹息无人会,三十年前宴海云。

 

君看,写着形容在,这同一塑造红山茶,倒成了外协调。

UTF-8: 0xe4b8ad 0xe69687

新兴茶花的项目更为层出不穷,颜色、花型、名字还更为多。徐致被生同一篇《山茶》诗对之作了详实的记述:

 

“山茶本后发出,旧不展现图经。花深嫌少态,曾称苏公评。迩来亦变怪,纷然著名称。黄香开太早,与菊为辈朋;粉红更妖娆,玉环带春酲;伟哉红白叶,花重枝不胜;尤善南山茶叶,花开一尺盈;月丹又其亚,不减红带革呈;……白茶亦数品,玉磬尤晶明;桃叶何处来,派别疑武陵。愈出逾奇怪,一见相同惊叹。”

Unicode: 0x4e2d 0x6587

不过绝被人口惊奇的,还是金庸在《天龙八部》里说之那同样栽:

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

“大理时有发生同样种植茶花,叫做‘十八读书人’,是大地的最佳,一株上一块初步十八朵,朵朵颜色各异,红的就是是咸红,紫的尽管是全紫,绝无半区划杂。而且十八朵花朵朵形状各异,各发生各个的妙处,开时同步开,谢时齐谢。”

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

多多不可思议!但以凡家庭流水,户户栽花的大理,我就算死心塌地相信了。

2)测试代码:

白山茶也是心里不能够放弃的明月特。

#include <iostream>
using namespace std;

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

看罢《暗恋桃花源》已出多年丁,每当想起剧中的云之凡,都像心里开始了相同枚白茶花。这同江滨柳惦念其底心思,想必没有太要命的分。或许在那么的年份,爱情本就是是平等桩奢侈品。战火可以无限制地于丁颇为隔山海,时间得私自地给人花白头发,然而思念山海不可阻的,爱在一个人之心地吗会永远年轻。当故事落幕的时,叫丁落泪已无是爱意,不是惋惜,只是同一份绵长的挂了。

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

所以如果有人送你同条山茶花,花瓣如米饭一样温润,你要知尊重,要报一个大妈的微笑,如冬阳一样的采暖。

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

小寒二候,你们那儿的山茶,开啊颜色之花?

当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中搜索内容,再进行输出,自然就是乱码;

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

理论分析:CodePage(GBK
936)找不交投,那么将控制台换成UTF-8;那么然先保存的,UTF-8汉语,再经过UTF-8对诺之汉字码,不就会出口汉字;理论类中,但于自身之win7
64位中文系统上,qt5.8,vs2017皆未果;

可能原因:我系统受cmd控制台并无支持UTF-8编码方式(有机会在win10备受测试后还举行补充)

缓解方法2:通过(知识点一,二,
五),总结,当要于控制高进行汉语输出时,编码方式应该保留也unicode,或ACSI(GBK);

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

输出宽字节汉语(详见知识而点四):例

#include <iostream>
using namespace std;

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

出口则只要因此wcout而未可知是cout;关于宽字符详见;知要点二后续,**知而点三**

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

1、cout和wcout

 在C++下,cout可以直接出口中文,但对此wcout却非常。对于wcout,需要以那个locale设为当地语言才会出口中文:

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

 也有人用要下语句的,但这会变动wcout的有着locale设置,比如数字“1234”会输出为“1,234”。

 wcout.imbue(locale(“”));

 在C语言下,locale设置为本地语言(C语言中只有全局locale)就足以正常输出了:

 setlocale(LC_CTYPE, “”);

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

 

知要一:编码**

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

  扩展ASCII: 1独字节8个,只所以7个非合理.于是第8员用于扩大ASCII字符集,这样就以基本上矣128只字符.于是用正在后128独字符来扩充表示若拉丁字母,希腊字母当特殊符号.但问题是欧洲那么同样宗国家多互动都独具不一样的独特字母,一起塞进后128个肯定不够,于是代码页出现了.

**  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).

DBCS很挺题材在字符串的字符数不能够透过字节数来决定,如”中文abc”,字符数是5,而字节数是7.对于用++或–运算符来所有历字符串的程序员来说,这简直就是噩梦!

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

啊是千篇一律种字符集/字符编码方法,它统一用唯一的字符集来含有这个星球上大部分语言的修系统.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.

UTF-8是关键!如果统一Unicode都用2字节意味着,英文字母觉得温馨就是充分吃亏(高字节始终是0字节).UTF-8提供了一致种植灵活的解决办法:以单字节(8bit)作为编码单元,变长多字节编码方式.如ASCII字母继续使用1字节储存,中文汉字用3字节囤积,其他最多而直6配节.

UTF-16与UTF-32需要出字节序标志BOM(FEFF)解决大端小端问题.UTF-8没有字节序的题目(因为以1独字节为单元).

 

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

其他注意点:

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地图