精华内容
下载资源
问答
  • 编码--了解编码网站编码

    千次阅读 2012-08-20 16:57:57
    经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符,  WordPress程序是用的UTF-8,很多cms用的是GB2312。  ● 为什么有这么多编码?  ● UTF-8和GB2312...
    经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符,
    

      WordPress程序是用的UTF-8,很多cms用的是GB2312。

      ● 为什么有这么多编码?

      ● UTF-8和GB2312有什么区别?

      ● 我们在国内做网站是用UTF-8编码格式还是GB2312编码格式好? 

      一. 各种编码的来历

      可能很多同学一直对字符的各种编码方式懵懵懂懂,根本搞不清为什么他们有这么多编码。

      ANSI编码

      其实在很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为“字节”。

      开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。 

      他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。

      遇上00×10,终端就换行,遇上0×07, 终端就向人们嘟嘟叫,例好遇上0×1b, 打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0×20以下的字节状态称为"控制码"。

      他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉很好,于是大家都把这个方案叫做 ANSI 的"Ascii"编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。

      扩展ANSI编码

      后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机保存他们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128到255这一页的字符集被称“扩展字符集”。从此之后,贪婪的人类再没有新的状态可以用了,美国当时估计也没想到还有别的国家要用计算机的。

      GB2312编码

      当天朝人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。天朝人民就不客气地把那些127号之后的奇异符号们直接取消掉。

      规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。

      在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫"半角"字符了。于是就把这种汉字方案叫做 “GB2312”。GB2312 是对 ASCII 的中文扩展。

      GBK 和 GB18030编码

      但是天朝的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些天朝领导的名字要是打不出很麻烦的。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。

      后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

      后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,天朝民族的文化就可以在计算机时代中传承了。

      在这个标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。

      那时候凡是受过编程学习的程序员都要每天念下面这个咒语数百遍的折磨:

      “一个汉字算两个英文字符!一个汉字算两个英文字符……”

      UNICODE编码

      因为当时各个国家都像天朝这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的编码方案:

      当时的天朝人想让电脑显示汉字,就必须装上一个“汉字系统”。专门用来处理汉字的显示、输入的问题。

      但是那个装台湾的人士写的程序就必须加装另一套支持 BIG5 编码的“倚天汉字系统”才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族中还有那些暂时用不上电脑的穷苦人民,他们的文字又怎么办?

      正在这时,天使及时出现了——一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它 UCS, 俗称 UNICODE 。( Universal Multiple-Octet Coded Character Set )

      在UNICODE 中,一个汉字算两个英文字符的时代已经快过去了。

      无论是半角的英文字母,还是全角的汉字,它们都是统一的“一个字符”!同时,也都是统一的“两个字节"”

      UTF-8和UTF-16

      UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE 如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到UTF时并不是直接的对应,而是要过一些算法和规则来转换。

      未来的UCS-4

      如前所述,UNICODE 是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。如果还不够也没有关系,ISO已经准备了UCS-4方案,说简单了就是四个字节来表示一个字符,这样我们就可以组合出21亿个不同的字符出来(最高位有其他用途),这大概可以用到天朝成立银河联邦成立那一天吧!

      二. 为什么有些网站打开有时候会是乱码

      网页乱码是浏览器(如IE等)对HTML网页解释时形成的。

      如果在浏览网站网页的代码写错语系(比较少见),有形如:

    <HTML>

    <HEAD>

    <META CONTENT=“text/html;charset=ISO-8859-1”></HEAD>……

    </HTML>

      的语句,浏览器在显示此页时,就会出现乱码。因为浏览器会将此页语种辨认为“欧洲语系”。

      解决的办法是将语种“ISO-8859-1”改为GB2312,如果是繁体网页则改为BIG5。

      还有一种可能比较大,就是网页并没有标明他用的是何种语系,即没有

      <META CONTENT=“text/html;charset=XXXXX“>,这一行。

      而你的计算机默认也不是这种语系,比方我们访问某些日文网站,经常出现这个问题。这个主要是由于程序员是面向当地的人开发的网站,由于当地都是默认语系,所以没有乱码种情况,而你是外来人,你的操作系统本身默认不是当地的语系。所以要手动改语系。

      至于出现口口口口口口这种情况

      这是由于网站并没有采用UTF-8编码而是采用的当地的编码,如蒙古语的,阿拉伯语的编码,你的计算机中并没有这种编码,所以不能识别。

      解决办法是,事先为浏览器安装多语言支持包(例如在安装IE时要安装多语言支持包),这样在浏览网页出现乱码时,就可以在浏览器中选择菜单栏下的“查看”/“编码”/“自动选择”/蒙古),如为繁体中文则选择“查看”/“编码”/“自动选择”/阿拉伯语,其它语言依此类推选择相应的语系,这样可消除网页乱码现象。

      三. 目前开发网站用什么编码比较好

      我们一般通俗的理解为:

      UTF-8是世界性通用代码,也完美的支持中文编码,如果我们做的网站能让国外用户正常的访问,就最好用UTF-8。

      GB2312属于中文编码,主要针对国内用户使用,如果国外用户访问GB2312编码的网站就会变乱码。

      网友的反馈一般觉得是用UTF-8比GB2312要多很多,大家都比较赞同用UTF-8。

      从一张外国网站的调查也可看得出:

       由此图可以看出,2001-2008年期间,GB2312编码的使用情况虽然幅度不大,但还是在稳定上升的;蓝色的线表示出用UTF-8的网站越来越多了。

      我挑选了国内部分几个大的门户网站,看看他们用的是哪种编码格式:

      也许有同学就会问了为什么国内几个网站用GB2312反而更多些呢。

      我也对这个疑问进行了思考,我觉得。应该有3种原因:

      1. 国内这些网站本身历史也比较长,开始使用的就是 GB2312编码,现在改成 UTF-8(以前的网页)转换的难度和风险太大。

      2. UTF-8编码的文件比GB2312更占空间一些,虽然目前的硬件环境下可以忽略,但是这些门户网站为了减少服务器负载基本上所有的页面都生成了静态页,UTF-8保存起来文件会比较大,对于门户级别的网站每天生成的文件量还是非常巨大,带来的存储成本相应提高。

      3. 由于UTF-8的编码比GB2312解码的网络传输数据量要大,对于门户级别的网站来说。这个无形之间就要增大带宽,用GB2312对网络流量无疑是最好的优化。

      所以在新做站的情况下,建议还是选择UTF-8比较好。因为没有上面那些原因,兼容为上策。

       转载自:http://www.jb51.net/web/25623.html
    展开全文
  • 编码

    千次阅读 2017-08-15 11:07:29
    编码
    1. ASCII码 

    我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。 

    上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 

    ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。 

    2、非ASCII编码 

    英语用128个符号编码就够了是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。 

    但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。 

    至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。 

    中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。 

    3.Unicode 

    正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。 

    可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。 

    Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。  

    4. Unicode的问题 

    需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。 

    比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。 

    这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。 

    它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。 


    Unicode相关的常见问题

    Unicode是两个字节吗?

    Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储为什么样的字节流,取决于字符编码方案。推荐的Unicode编码是UTF-16和UTF-8。

    带签名的UTF-8指的是什么意思?

    带签名指的是字节流以BOM标记开始。很多软件会“智能”的探测当前字节流使用的字符编码,这种探测过程出于效率考虑,通常会提取字节流前面若干个字节,看看是否符合某些常见字符编码的编码规则。由于UTF-8和ASCII编码对于纯英文的编码是一样的,无法区分开来,因此通过在字节流最前面添加BOM标记可以告诉软件,当前使用的是Unicode编码,判别成功率就十分准确了。但是需要注意,不是所有软件或者程序都能正确处理BOM标记,例如PHP就不会检测BOM标记,直接把它当普通字节流解析了。因此如果你的PHP文件是采用带BOM标记的UTF-8进行编码的,那么有可能会出现问题。

    Unicode编码和以前的字符集编码有什么区别?

    早期字符编码、字符集和代码页等概念都是表达同一个意思。例如GB2312字符集、GB2312编码,936代码页,实际上说的是同个东西。但是对于Unicode则不同,Unicode字符集只是定义了字符的集合和唯一编号,Unicode编码,则是对UTF-8、UCS-2/UTF-16等具体编码方案的统称而已,并不是具体的编码方案。所以当需要用到字符编码的时候,你可以写gb2312,codepage936,utf-8,utf-16,但请不要写unicode(看过别人在网页的meta标签里头写charset=unicode,有感而发)。



    5.UTF-8 

    互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。 

    UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。 

    UTF-8的编码规则很简单,只有二条: 

    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 

    2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 

    下表总结了编码规则,字母x表示可用编码的位。 

    Unicode符号范围 | UTF-8编码方式 
    (十六进制) | (二进制) 
    --------------------+--------------------------------------------- 
    0000 0000-0000 007F | 0xxxxxxx 
    0000 0080-0000 07FF | 110xxxxx 10xxxxxx 
    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 
    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 

    下面,还是以汉字“严”为例,演示如何实现UTF-8编码。 

    已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。 

    6. Unicode与UTF-8之间的转换 

    通过上一节的例子,可以看到“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。它们之间的转换可以通过程序实现。 

    在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。 



    里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8。 

    1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。 

    2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。 

    3)Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。 

    4)UTF-8编码,也就是上一节谈到的编码方法。 

    选择完”编码方式“后,点击”保存“按钮,文件的编码方式就立刻转换好了。 

    7. Little endian和Big endian 

    上一节已经提到,Unicode码可以采用UCS-2格式直接存储。以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。 

    这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。 

    因此,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。 

    那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码? 

    Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。 

    如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。 

    8. 实例 

    下面,举一个实例。 

    打开”记事本“程序Notepad.exe,新建一个文本文件,内容就是一个”严“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。 

    然后,用文本编辑软件UltraEdit中的”十六进制功能“,观察该文件的内部编码方式。 

    1)ANSI:文件的编码就是两个字节“D1 CF”,这正是“严”的GB2312编码,这也暗示GB2312是采用大头方式存储的。 

    2)Unicode:编码是四个字节“FF FE 25 4E”,其中“FF FE”表明是小头方式存储,真正的编码是4E25。 

    3)Unicode big endian:编码是四个字节“FE FF 4E 25”,其中“FE FF”表明是大头方式存储。

    4)UTF-8:编码是六个字节“EF BB BF E4 B8 A5”,前三个字节“EF BB BF”表示这是UTF-8编码,后三个“E4B8A5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。 


    9.

    编码系统的变化

    在Unicode出现之前,所有的字符集都是和具体编码方案绑定在一起的,都是直接将字符和最终字节流绑定死了,例如ASCII编码系统规定使用7比特来编码ASCII字符集;GB2312以及GBK字符集,限定了使用最多2个字节来编码所有字符,并且规定了字节序。这样的编码系统通常用简单的查表,也就是通过代码页就可以直接将字符映射为存储设备上的字节流了。例如下面这个例子:

    image

    这种方式的缺点在于,字符和字节流之间耦合得太紧密了,从而限定了字符集的扩展能力。假设以后火星人入住地球了,要往现有字符集中加入火星文就变得很难甚至不可能了,而且很容易破坏现有的编码规则。

    因此Unicode在设计上考虑到了这一点,将字符集和字符编码方案分离开。

    字符编码系统

    也就是说,虽然每个字符在Unicode字符集中都能找到唯一确定的编号(字符码,又称Unicode码),但是决定最终字节流的却是具体的字符编码。例如同样是对Unicode字符“A”进行编码,UTF-8字符编码得到的字节流是0x41,而UTF-16(大端模式)得到的是0x00 0x41。

    展开全文
  • 一.Huffman编码与解码 (Huffman编码、二叉树) [问题描述] 对一篇英文文章(大于...(2) 在Huffman编码后,要将编码表和英文文章编码结果保存到文件中,编码结果必须是二进制形式,即0 1的信息用比特位表示,不...

    一.Huffman编码与解码 (Huffman编码、二叉树)
    [问题描述]
    对一篇英文文章(大于2000个英文字符),统计各字符出现的次数,实现Huffman编码,以及对编码结果的解码。
    [基本要求]
    (1) 输出每个字符出现的次数和编码,其中求最小权值要求用堆实现。
    (2) 在Huffman编码后,要将编码表和英文文章编码结果保存到文件中,编码结果必须是二进制形式,即0 1的信息用比特位表示,不能用字符’0’和’1’表示。
    (3) 提供读编码文件生成原文件的功能。

    二.数据结构说明
    在该程序中使用了两个个结构体来完成编码,用位域来实现bite流存储,字符的种类是根据ascll码表里的字符对应匹配存储的:

    const charsourcef = “d:\Cpp-charcode\EnglishSC.txt”;//英文源文章
    const char
    transf = “d:\Cpp-charcode\EnglishT.txt”;//通过编码翻译的英文文章
    const charsortf = “d:\Cpp-charcode\EnglishST.txt”;//分类好的字符及频数编码
    const char
    codef = “d:\Cpp-charcode\EnglishCode.dat”;//整篇英文文章的编码
    const char*bitef = “d:\Cpp-charcode\EnglishBite.dat”; //每一种字符的比特位编码
    注意:这里的路径,其中文件夹是要事先手动创建的。

    //哈夫曼树
    typedef struct HTNode
    {
    int Ascll;//字符对应的ASCLL码
    int weight;//权值
    int LC, RC, P;//左,右,父结点下标
    }HTNode,*LinkHTNode;

    //存储叶子节点编码在哈夫曼树对应的位置及,编码
    typedef struct HTStr
    {
    int pos;//叶子节点的字符在哈夫曼树中的位置
    int s;//ASCLL码值
    char *code;//字符对应的哈夫曼编码
    }*LinkHTStr;

    //位域bite
    typedef struct Bite
    {
    unsigned int bit : 1;//占一个位的无符号整形
    }Bite;

    三、执行结果

    在这里插入图片描述

    原英文文章
    在这里插入图片描述
    哈夫曼树结构(子结点和父结点的情况):
    ASCLL为0表示为内节点,并非叶子节点
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    字符统计情况:
    在这里插入图片描述
    在这里插入图片描述
    整个文章的哈夫曼码:
    在这里插入图片描述
    在这里插入图片描述
    通过哈夫曼树解码出的结果:
    在这里插入图片描述
    四、代码情况
    所需头文件&结构定义:

    #include "stdafx.h"
    #include<iostream>
    #include<fstream>
    #include<iomanip>
    using namespace std;
    
    const char*sourcef = "d:\\Cpp-charcode\\EnglishSC.txt";//英文源文章
    const char*transf = "d:\\Cpp-charcode\\EnglishT.txt";//通过编码翻译的英文文章
    const char*sortf = "d:\\Cpp-charcode\\EnglishST.txt";//分类好的字符及频数编码
    const char*codef = "d:\\Cpp-charcode\\EnglishCode.dat";//整篇英文文章的编码
    const char*bitef = "d:\\Cpp-charcode\\EnglishBite.txt"; //每一种字符的比特位编码
    
    
    //哈夫曼树
    typedef struct HTNode
    {
    	int Ascll;//字符对应的ASCLL码
    	int weight;//权值
    	int LC, RC, P;//左,右,父结点下标
    }HTNode,*LinkHTNode;
    
    //存储叶子节点编码在哈夫曼树对应的位置及,编码
    typedef struct HTStr
    {
    	int pos;//叶子节点的字符在哈夫曼树中的位置
    	int s;//ASCLL码值
    	char *code;//字符对应的哈夫曼编码
    }*LinkHTStr;
    
    //位域bite
    typedef struct Bite
    {
    	unsigned int bit : 1;//占一个位的无符号整形
    }Bite;
    

    PS:值得再次强调,文件路径里的文件夹需要自己手动创建好,程序执行过程是不会创建文件夹的。

    函数定义&实现:

    //分类函数
    void sort_str(const char*file1,LinkHTNode &HT)
    {
    	char ch;//临时存储每次拿到的字符
    	int s;//用于转换ASCLL码对应的十进制数值
    
    	int *strw = new int[100];//临时存储英文文章统计后的每种字符的个数
    
    	//初始化统计字符频数数组
    	for (int i = 0; i < 100; i++)
    	{
    		strw[i] = 0;
    	}
    	
    	// 分类文件字符
    	ifstream ifile(file1, ios::in);
    	while (ifile.get(ch))
    	{
    		s = ch;
    		
    		if (s == 10) { strw[0]++; }//换行符
    		if ((s - 31)>0) { strw[s - 31]++; }//32-127号的字符
    	
    	}
    
    	//统计出现的字符种类
    	s = 0;
    	for (int i = 0; i < 100; i++)
    	{
    		if (strw[i] != 0)s++;
    	}
    
    	//初始化哈夫曼树
    	HT = new HTNode[2 * s ];//0号位不存,需要多开一个单元内存
    	for (int i = 0; i < 2 * s ; i++)
    	{
    		HT[i].Ascll = 0; HT[i].weight = 0;
    		HT[i].LC = HT[i].RC = HT[i].P = 0; 
    	}
    	HT[0].weight = s;//叶子结点数
    
    	//剔除未出现的字符,存储字符和权值
    	int  k;
    	if (strw[0] != 0)//换行符单独判断存储
    	{
    		HT[1].Ascll = 10;
    		HT[1].weight = strw[0];
    		HT[0].Ascll += HT[1].weight;
    		 k = 2;//有换行符就从2位置开始存储之后的字符
    	}
    	else { k = 1; }//否则,从1号位开始
    	for (int i=1;i <100; i++)
    	{
    		if (strw[i] != 0)
    		{
    			HT[k].Ascll = i + 31;
    			HT[k].weight = strw[i];
    			HT[0].Ascll += HT[k].weight;
    			k++;
    		}
    	}
    	delete []strw;//销毁临时空间
    }
    
    
    //初建堆
    void HeapAdjust(LinkHTNode &HT, int s, int m)//哈夫曼树,堆头,堆尾
    {
    	HTNode rc = HT[s];//暂存堆顶结点
    	for (int j = 2 * s; j <= m; j *= 2)
    	{
    		if (j < m&&HT[j].weight > HT[j + 1].weight)++j;//左右孩子比较大小,取小的一个
    		if (rc.weight <= HT[j].weight)break;
    		HT[s] = HT[j]; s = j;//较小的孩子与父节点比较,小的最后作为的父节点
    	}
    	HT[s] = rc;
    }
    void CreatHeap(LinkHTNode &HT)
    {
    	int n = HT[0].weight;//初始堆的个数,即叶子节点数
    	for (int i = n / 2; i > 0; --i)
    		HeapAdjust(HT, i, n);
    }
    
    //堆排序
    void HeapSort(LinkHTNode &HT,LinkHTStr &Str)//哈夫曼树,叶子结点表
    {
    	CreatHeap(HT);
    	Str = new HTStr[HT[0].weight];//动态建立Str
    	int n = HT[0].weight;//叶子结点数
    	int k = 0;
    	int i = 2 * n - 1;//哈夫曼树表尾
    	//创建哈夫曼树
    	for ( ;i >1 ;i--)
    	{
    		k++;
    		HT[i]= HT[1];//选出的堆顶元素放到哈夫曼树尾
    		if (k % 2) { HT[1] = HT[n]; n--;  }//只选出一个最小数时,堆尾放上上对顶
    		else //选出两个最小数之后,合成新的节点,合成新的结点放在堆顶
    		{ 
    		HT[1].weight = HT[i + 1].weight + HT[i].weight; 
    		HT[1].Ascll = 0; HT[1].LC = i + 1;
    		HT[1].RC = i;
    		}
    		HeapAdjust(HT, 1, n);//堆排
    	}
    
    	//挑选叶子节点储存到另一个空间
    	n--;
    	for (; i <= k + 1; i++)
    	{
    		if (HT[i].LC) { HT[HT[i].LC].P = i; }
    		if (HT[i].RC) { HT[HT[i].RC].P = i; }
    		if (HT[i].Ascll) { Str[n].pos = i; Str[n].s = HT[i].Ascll; n++; 
    		}
    	}
    }
    
    
    //哈夫曼编码
    void HTFmanCode(LinkHTNode &HT,LinkHTStr &Str)
    {
    	char *code = new char[HT[0].weight];//临时的存储每一个字符的编码
    	int n = HT[0].weight-1;
    	int f, c;//f为父结点,c为子结点
    
    	for (int i = 0; i < HT[0].weight; i++)
    	{
    		f = HT[Str[i].pos].P;//父节点
    		c = Str[i].pos;//子节点
    		
    		while (f)
    		{
    			if (c == HT[f].LC) { code[n] = '0'; }
    			else { code[n] = '1'; }
    			n--;
    			c = f;//往根的方向回溯,子结点更改为它的父结点
    			f = HT[f].P;
    		}
    		//整理每次编好的字符编码,存储到Str[i].code中
    		int length = HT[0].weight - n - 1;
    		Str[i].code = new char[length+1];
    		Str[i].code[length] = '\0';
    		for(int k=0;k<length;k++)
    		{
    			Str[i].code[k] = code[n + 1];
    			n++;
    		}
    	}
    }
    
    // 存储
    void Save(const char*filechar, const char*filecode, LinkHTStr Str,LinkHTNode HT)
    {
    	ofstream ofilechar(filechar, ios::out);//储存字符,权值,编码的文件
    	ofstream ofilecode(filecode, ios::binary);//存储整篇文章的编码的文件
    	ofstream ofilebite(bitef, ios::binary);//存储每种字符的编码文件
    	
    	ifstream ifile(sourcef, ios::out);
    
    	char ch; Bite B_Save;
    	//储存字符,权值,编码到文件
    	ofilechar << "字符" << setw(20) << "频数" << setw(20) << "编码" << endl;
    	for (int i = 0; i < HT[0].weight; i++)
    	{
    		if (Str[i].s == 10) { ofilechar << "LF" << setw(20) << HT[Str[i].pos].weight << setw(22) << Str[i].code << endl; continue; }
    		if (Str[i].s == 32) { ofilechar << "Space" << setw(17) << HT[Str[i].pos].weight << setw(22) << Str[i].code << endl; continue; }
    		ofilechar << char(Str[i].s) << setw(21) << HT[Str[i].pos].weight << setw(22) << Str[i].code << endl;
    		//下面的for用于存储编码的比特位(每种字符的)
    		for (int k = 0; Str[i].code[k] != '\0'; k++)
    		{
    			if (Str[i].code[k] == '0')
    				B_Save.bit = 0;
    			else B_Save.bit = 1;
    			ofilebite << B_Save.bit;
    		}
    	}
    	//存储整篇文章的编码
    	while (ifile.get(ch))
    	{
    		for (int i = 0; i < HT[0].weight; i++)
    		{
    			if (ch == char(Str[i].s))
    			{
    				ofilecode << Str[i].code;
    			}
    		}
    	}
    	//关闭文件
    	ofilechar.close();
    	ofilecode.close();
    	ofilebite.close();
    	ifile.close();
    
    }
    //通过01文件编码翻译文章
    void Translate(const char*filecode, const char*fileTrans,LinkHTNode HT)
    {
    	ifstream ifile(filecode, ios::in);
    	ofstream ofile(fileTrans, ios::out);
    	char ch;
    	int f=1;
    	while (ifile.get(ch))
    	{
    		if (ch == '0')f = HT[f].LC;
    		else f = HT[f].RC;
    		if (HT[f].LC == 0&&HT[f].RC == 0) { ofile << char(HT[f].Ascll); f = 1; continue; }
    		
    	}
    	ifile.close();
    	ofile.close();
    }
    
    

    主函数:

    int main()
    {
    	HTNode *HT;
    	HTStr *Str;
    
    	sort_str(sourcef,HT);
    	HeapSort(HT, Str);
    	HTFmanCode(HT, Str);
    	Save(sortf, codef, Str, HT);
    	Translate(codef, transf, HT);
    	cout << "字符总个数:  " << HT[0].Ascll <<'\n'<< endl;
    	cout << "字符总类:   " << HT[0].weight << '\n' << endl;
    
    	cout << "哈夫曼树创建成功\n" << endl;
    	cout << "所有字符以及、字符对应的哈夫曼编码已保存到相应的txt文件\n"<<endl;
    	
    	ofstream of(bitef, ios::out);
    	of << "ASCLL码" << setw(10) << "位置" << setw(10) << "左孩子" << setw(10) << "右孩子" << setw(10)<<"父结点"<<endl;
    	for (int i = 1; i < 2 * HT[0].weight; i++)
    	{
    		of << HT[i].Ascll << setw(10) << i << setw(10) << HT[i].LC << setw(10) << HT[i].RC << setw(10) << HT[i].P << endl;
    	}
    	of.close();
        return 0;
    
    }
    

    五、小结

    1. 分类函数是把原文章的字符分好类,并统计好出现的频数,并把出现的次数当作其权值大小。
    2. 在这里用了堆排序进行筛选每次新增结点和原始节点中的最大权值。
    展开全文
  • 英文编码

    千次阅读 2009-05-05 10:09:00
    英文编码有很多种,但是一直搞不清在一个包含中文和英文的文档中,操作系统怎么区分下一个是取两个字符按中文表示还是取1个字符按英文处理。比如一个txt文档里面包含“hello你好”这段文本,我们知道hello很显然是...

    中英文编码有很多种,但是一直搞不清在一个包含中文和英文的文档中,操作系统怎么区分下一个是取两个字符按中文表示还是取1个字符按英文处理。比如一个txt文档里面包含“hello你好”这段文本,我们知道hello很显然是按ASCII编码占5个字符,“你好”一般按Unicode编码,是占4个字符。也就是两个字符表示一个汉字,但是操作系统怎么区分o后面是要去两个字符映射汉字呢还是直接取一个字符映射一个字母?我想英文编码和中文编码肯定有区分的地方,今天看到一遍文章简单介绍了这个区别。

    1、字符编码、内码,顺带介绍汉字编码字符必须编码后才能被计算机处理。

    计算机使用的缺省编码方式就是计算机的内码。

    早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

    GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。

    汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。

    其中有5个空位是D7FA-D7FE。

    GB2312支持的汉字太少。

    1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。

    2000年的GB18030是取代GBK1.0的正式国家标准。

    该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。

    现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

    从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。

    在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

    有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。

    不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

    这里还有一些细节: GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。 在DBCS中,GB内码的存储格式始终是big endian,即高位在前。

    GB2312的两个字节的最高位都是1。

    但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。

    不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

    2、Unicode、UCS和UTF 前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。

    而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。

    例如“汉”字的Unicode编码是6C49,而GB码是BABA。

     Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。

    Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。

    根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org)。

    ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目。 在1991年前后,双方都认识到世界不需要两个不兼容的字符集。

    于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。

    目前两个项目仍都存在,并独立地公布各自的标准。

    Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。

     UCS规定了怎么用多个字节表示各种文字。

    怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16。

    IETF的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。

    我总是记不得IETF是Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。

    3、UCS-2、UCS-4、BMP UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。

    下面让我们做一些简单的数学游戏:

    UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

    UCS-4根据最高位为0的最高字节分成2^7=128个group。

    每个group再根据次高字节分为256个plane。

    每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

    group 0的plane 0被称作Basic Multilingual Plane, 即BMP。

    或者说UCS-4中,高两个字节为0的码位被称作BMP。

    将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。

    在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

    4、UTF编码 UTF-8就是以8位为单元对UCS进行编码。

    从UCS-2到UTF-8的编码方式如下:

    UCS-2编码(16进制) UTF-8 字节流(二进制) 0000 - 007F 0xxxxxxx 0080 - 07FF 110xxxxx 10xxxxxx 0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

    例如“汉”字的Unicode编码是6C49。

    6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。

    将6C49写成二进制是:0110 110001 001001,

    用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

     读者可以用记事本测试一下我们的编码是否正确。

     UTF-16以16位为单元对UCS进行编码。

    对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。

    对于不小于0x10000的UCS码,定义了一个算法。

    不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。

    但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

     5、UTF的字节序和BOM UTF-8以字节为编码单元,没有字节序的问题。

    UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。

    例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。

    如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”? Unicode规范中推荐的标记字节顺序的方法是BOM。

    BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。

    BOM是一个有点小聪明的想法: 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。

    而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

    UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

    这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。

    因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

    UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。

    字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。

    所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。 Windows就是使用BOM来标记文本文件的编码方式的。

    展开全文
  • 英文字母编码问题

    千次阅读 2012-03-04 17:37:34
    【座右铭】1. 想要成为行家,就必须尝试解决大量的...1. 五笔的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把五笔的编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b,
  • 英文字母和中文汉字在不同字符集编码下的字节数英文字母:字节数 : 1;编码:GB2312字节数 : 1;编码:GBK字节数 : 1;编码:GB18030字节数 : 1;编码:ISO-8859-1字节数 : 1;编码:UTF-8字节数 : 4;编码:UTF-16字节数 ...
  • 本文首先简要介绍了编码和解码的概念。然后简单介绍了java的中英文编码和解码问题。
  • 字符字节与编码 字符是人们常用的一些记号,比如”1”, “汉”, ...编码是大家对计算机如何使用字节来表示一个字符的约定,可分为ASCII编码,ANSI编码(本地化编码),UNICODE编码(国际化编码)三种。 1.ASCI...
  • 中文汉字、英文数字的unicode编码范围
  • 英文字母和中文汉字在不同字符集编码下的字节数英文字母:字节数 : 1;编码:GB2312字节数 : 1;编码:GBK字节数 : 1;编码:GB18030字节数 : 1;编码:ISO-8859-1字节数 : 1;编码:UTF-8字节数 : 4;编码:UTF-16字节数 ...
  • 拨开字符编码的迷雾--字符编码概述

    万次阅读 2017-11-27 20:46:23
    相信不少人在字符编码上面摔过跟头,这篇文章针对开发中需要了解的字符编码知识进行了简要的讲解,希望能够对大家有所帮助。 1. ASCII及其扩展 1.1 什么是ASCII字符集 字符集就是一系列用于显示的字符的...
  • 从大一上C语言就开始认识了Ascll编码,ascll码也算是我们最早所接触的编码 【1】Ascll码  Ascll码由三部分组成:  第一部分从00H到1FH共32个,一般用来通信或作为开工至之用,有的可以显示在屏幕上,有的则无法...
  • 作为上个学期期末考试的课程设计(虽然上交的时间推迟了几天,而且做得...强调的是不限制文章的大小,理论上【注】可以将一篇非常大的英文文章进行编码解码(当时做设计的时候从百度的一部分例子都是用的数组,限制文章
  • 编码与软编码

    千次阅读 多人点赞 2018-11-07 17:23:18
    编码:就是将数据直接写入到代码中进行编译开发,比如在没有mybatits前,将sql语句写入到jdbc代码里,在比如纯jsp开发的...软编码:则是将数据与源代码解耦,比如mybatis的配置文件,将sql于底层代码分离,就只...
  • 文本编码

    万次阅读 2016-03-01 00:05:49
    文本编码 文本编码这个问题自三年前就困扰着我,当时是用Python处理多国语言时出现的bug,最后问题解决了,但其中具体逻辑并不懂。后来零零散散接触了不少资料,算是大致弄明白,记录如下。 unicode与ascii等编码...
  • java安全编码指南之:字符串和编码

    万次阅读 2020-09-16 09:41:28
    字符串是我们日常编码过程中使用到最多的java类型了。全球各个地区的语言不同,即使使用了Unicode也会因为编码格式的不同采用不同的编码方式,如UTF-8,UTF-16,UTF-32等。 我们在使用字符和字符串编码的过程中会...
  • 计算机编码

    千次阅读 2018-09-12 20:09:33
    * 1*计算机编码** ...通俗一点讲,各种符号、文字、数字就像是各种五花八门的语言,而计算机编码则像是翻译机,将这些”语言”翻译“成计算机能够识别的”英语“(二进制)。 1.2 为什么要计算机编码 上...
  • 字符编码那些事--彻底理解掌握编码知识

    千次阅读 多人点赞 2020-05-04 16:42:33
    每一个程序员都不可避免的遇到字符编码的问题,很多人在字符编码方面同样遇到不少问题,而且一直对各种编码懵懵懂懂、不清不楚。这篇文章就是针对字符编码中的一些问题进行了详细的阐述,能从根本上理解字符编码
  • 中文编码

    千次阅读 2018-10-06 12:02:52
    一开始是为了和计算机进行沟通,出现了英文的ASCII码;后来因为各个国家语言不同,也有自己的一套编码格式,所以出现了ISO8859系列。Unicode等 1.2.编码的种类: ①ASCII:用一个字节的7位进行表示,只能表示128个...
  • ASCII编码

    千次阅读 2020-01-11 12:29:50
    ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准...
  • 编码历史与主要编码方式

    千次阅读 2015-03-23 11:53:53
    初始编码,匹配英文字符 1 一共规定了127个字符的编码,32以下的被作为控制字符 扩展ASCII 加入符号字符编码 1 加入新的字母符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,编码到255 GB...
  • 编码问题

    千次阅读 2013-04-18 19:25:38
    解决乱码问题 ...为了避免乱码的出现: 注意 ...1,html、php的meta中的charset信息的编码 ...2,html、php等文件保存的编码...utf-8 统一的编码,它支持中文和英文,建议建表的时候都是用utf-8,利于网站国际化 g
  • 原文地址:http://www.cnblogs.com/lancidie/archive/2013/04/12/3017241.html英文字母:编码:GB2312;字节数 : 1编码:GBK;字节数 : 1编码:GB18030;字节数 : 1编码:ISO-8859-1;字节数 : 1编码:UTF-8;字节数...
  • 默认语言: [root@localhost~]$ cat/etc/locale.conf&lt;-----之前的/etc/sysconfig/i18n 已变为 /etc/locale....------默认是英文或[root@localhost~]$ echo $LANG查看系统已安装的语言包:$ localeLANG=en_...
  • 使用locale命令,语言是en_US(美式英语),编码是UTF-8 2、修改字符编码和语言 修改/etc/sysconfig/i18n 先看一下修改前的 然后,如改成中文编码: LANG=en_US.UTF-8 改为 LANG="zh_CN.GBK" ...
  • 编码单元

    千次阅读 2015-06-02 16:14:35
    编码树单元(英语:Coding Tree Unit,缩写:CTU)是H.265/高效率视讯编码(High Efficiency Video Coding, HEVC)的处理单元。此处理单元类似H.264/高阶视讯编码(Advanced Video Coding, AVC)中的宏区块(Macroblock)。...
  • 哈夫曼编码

    千次阅读 2014-06-04 23:22:34
    哈夫曼编码 一、简介 1.1定义 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的...
  • 英文字母对应的Unicode编码

    千次阅读 2019-03-20 23:39:00
    如果想要知道字符串中的值是否是小写英文字符,不使用工具包的一种方法就是使用Unicode编码值,举例: package main import ( "fmt" ) func main() { // str := "helloworld" //返回str is all ...
  • 字符编码

    千次阅读 2015-12-25 19:25:59
    1、什么是字符编码?  我们知道,计算机数据只能是二进制的,数值类型的数据转换成二进制很简单,我们已经了解了,但字符类型如何转换成二进制呢?这就需要使用字符编码!  在编码表中,每个字符都有对应的编码,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 308,474
精华内容 123,389
关键字:

英文网站编码