GBK、UTF-8、ASCLL、url编码

GBK

      GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)。GBK 向下与 GB 2312 编码兼容,向上支持ISO 10646国际标准,是前者向后者过渡过程中的一个承上启下的产物。GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。

代码与缩写

原gb2312 HTML编码标签代码如下:

1.gbk简写截图:

2.缩写兼容性:所有浏览器均兼容,无论新旧版本IE还是不同品牌浏览器均兼容。至于GBK编码简写时候编码填写为gb2312还是填写为gbk,DIV CSS认为没有什么区别,均可。为了符合大家都使用gbk字符编码,大家可以写为“gb2312”。

知识链接

      编码,是指以固定的顺序排列字符,并以此做为记录、存贮、传递、交换的统一内部特征,这个字符排列顺序被称为“编码”。和中文字库有关的编码标准有:国标GB码、GBK码、港台BIG-5码等,不同编码的汉字字库都与汉字的应用有密切关系。

相关概念

编码方式

      经实际测试和查阅文档,GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。

字汇

GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号,并有所补充。具体包括:

  1. GB 2312 中的全部汉字、非汉字符号。
  2. GB 13000.1-1993 中的其他 CJK 汉字。以上合计 20902 个 GB 化汉字。
  3. 《简化字总表》中未收入 GB 13000.1 的 52 个汉字。
  4. 康熙字典》及《辞海》中未收入 GB 13000.1 的 28 个部首及重要构件。
  5. 13 个汉字结构符。
  6. BIG-5 中未被 GB 2312 收入、但存在于 GB 13000.1 中的 139 个图形符号。
  7. GB 12345 增补的 6 个拼音符号。
  8. 汉字“○”。
  9. GB 12345 增补的 19 个竖排标点符号(GB 12345 较 GB 2312 增补竖排标点符号 29 个,其中 10 个未被 GB 13000.1 收入,故 GBK 亦不收)。
  10. 从 GB 13000.1 的 CJK 兼容区挑选出的 21 个汉字。
  11. GB 13000.1 收入的 31 个 IBM OS/2 专用符号。
  12. 未录入《新华字典》上的一些字,如“韡”的简体。

分配及顺序

      GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

全部编码分为三大部分:

1.汉字区。包括:

a. GB 2312 汉字区。即 GBK/2: B0A1-F7FE。收录 GB 2312 汉字 6763 个,按原顺序排列。

b. GB 13000.1 扩充汉字区。包括:

(1) GBK/3: 8140-A0FE。收录 GB 13000.1 中的 CJK 汉字 6080 个。

(2) GBK/4: AA40-FEA0。收录 CJK 汉字和增补的汉字 8160 个。CJK 汉字在前,按 UCS 代码大小排列;增补的汉字(包括部首和构件)在后,按《康熙字典》的页码/字位排列。

2.图形符号区。包括:

a. GB 2312 非汉字符号区。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符号外,还有 10 个小写罗马数字和 GB 12345 增补的符号。计符号 717 个。

b. GB 13000.1 扩充非汉字区。即 GBK/5: A840-A9A0。BIG-5 非汉字符号、结构符和“○”排列在此区。计符号 166 个。

3.用户自定义区:分为(1)(2)(3)三个小区。

(1) AAA1-AFFE,码位 564 个。

(2) F8A1-FEFE,码位 658 个。

(3) A140-A7A0,码位 672 个。

第(3)区尽管对用户开放,但限制使用,因为不排除未来在此区域增补新字符的可能性。

字形

GBK 对字形作了如下的规定:

1. 原则上与 GB 13000.1 G列(即源自中国大陆法定标准的汉字)下的字形/笔形保持一致。

2. 在 CJK 汉字认同规则的总框架内,对所有的 GBK 编码汉字实施“无重码正形”(“GB 化”);即在不造成重码的前提下,尽量采用中国新字形。

3. 对于超出 CJK 汉字认同规则的、或认同规则尚未明确规定的汉字,在 GBK 码位上暂安放旧字形。这样,在许多情况下 GBK 收入了同一汉字的新旧两种字形。

4. 非汉字符号的字形,凡 GB 2312 已经包括的,与 GB 2312 保持一致;超出 GB 2312 的部分,与 GB 13000.1 保持一致。

5. 带声调的拼音字母取半角形式。

UTF-8

      UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。因此,它逐渐成为电子邮件网页及其他存储或传送文字的应用中,优先采用的编码。

基本特征

      UCS字符U+0000到U+007F(ASCII)被编码为字节0×00到0x7F(ASCIⅡ兼容)。这意味着只包含7位ASCIl字符的文件在ASCIⅡ和UTF-8两种编码方式下是一样的。

      UTF-8编码字符理论上可以最多到4个字节长,然而16位BMP字符最多只用到3字节长,Bigendian UCS-4字节串的排列顺序是预定的,字节0xFE和OxFF在UTF-8编码中从未用到。

编码字节数

UTF-8使用1~4字节为每个字符编码:

  • 一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
  • 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
  • 其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
  • 其他极少使用的语言字符使用4字节编码。

字符集

UTF-8编码规则:如果只有一个字节则取值为\x00-\x7F。其余字节按长度进行以下拓展:

UTF-8由4种编码方式实现,即UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4。其中:

UTF8, 16进制编码表

UTF8-1\x00-\x7F
UTF8-2\xC2-\xDF \x80-\xBF
UTF8-3

\xE0 \xA0-\xBF \x80-\xBF

\xE1-\xEC \x80-\xBF \x80-\xBF

\xED \x80-\x9F \x80-\xBF

\xEE-\xEF \x80-\xBF \x80-\xBF

UTF8-4

\xF0 \x90-\xBF \x80-\xBF \x80-\xBF

\xF1-\xF3 \x80-\xBF \x80-\xBF \x80-\xBF

\xF4 \x80-\x8F \x80-\xBF \x80-\xBF

      注:每种编码可能有多个编码范围,每个编码范围间,以空格作为每个字节的分隔符。例如UTF8-3的第一个编码,其第一个字节取值必须为\xE0,第二个字节范围为\xA0-\xBF,第三个字节为\x80-\xBF。

优缺点

优点

      UTF-8编码可以通过屏蔽位和移位操作快速读写。字符串比较时strcmp()和wcscmp()的返回结果相同,因此使排序变得更加容易。字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来表明UTF-16或UTF-32文本(见BOM) UTF-8 是字节顺序无关的。它的字节顺序在所有系统中都是一样的,因此它实际上并不需要BOM。

缺点

      你无法从UNICODE字符数判断出UTF-8文本的字节数,因为UTF-8是一种变长编码它需要用2个字节编码那些用扩展ASCII字符集只需1个字节的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集 8位字符的UTF-8编码会被email网关过滤,因为internet信息最初设计为7位ASCII码。因此产生了UTF-7编码。 UTF-8 在它的表示中使用值100xxxxx的几率超过50%, 而现存的实现如ISO 2022, 4873, 6429, 和8859系统,会把它错认为是C1 控制码。因此产生了UTF-7.5编码。

词条图册

 ASCLL

      ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。

表达方式

  • ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 [1] 。其中:
  • 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响 [1]
  • 32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
  • 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

大小规则

常见ASCII码的大小规则:0~9<A~Z<a~z。

  1. 数字比字母要小。如 “7”<“F”;
  2. 数字0比数字9要小,并按0到9顺序递增。如 “3”<“8” ;
  3. 字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z” ;
  4. 同个字母的大写字母比小写字母要小32。如“A”<“a” 。

几个常见字母的ASCII码大小: “A”为65;“a”为97;“0”为 48 。

ASCII 字符集

  • ASCII ,它的全称是"美国信息交换标准代码"。它设计于60年代早期,是计算机和诸如打印机、磁带驱动器之类的硬件设备的标准字符集。
  • ASCII 是 7 比特字符集,包含了 128 个不同的字符值。
  • ASCII 支持 0-9 的数字,A-Z大写和小写英文字母,以及一些特殊字符。
  • 被广泛使用于现代计算机、HTML和因特网上的字符集都是基于 ASCII 。
  • 以下表格列举了128个 ASCII 字符以及对应的 HTML 实体编码。

URL编码

      url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况,在服务器端的表单输入格式样子象这样:

theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes

防止sql注入

       URL编码平时是用不到的,因为IE会自动将输入到地址栏的非数字字母转换为url编码。曾有人提出数据库名字里带上“#”以防止被下载,因为IE遇到#就会忽略后面的字母。破解方法很简单——用url编码%23替换掉#。现在SQL注射非常流行,所以就有人写了一些防注射的脚本。下面××SQL通用防注入asp版部分代码。

URL - 统一资源定位器

Web 浏览器通过 URL 从 web 服务器请求页面。

URL 是网页的地址,比如: https://www.runoob.com

URL 编码

  • URL 只能使用 ASCII 字符集来通过因特网进行发送。
  • 由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
  • URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符。
  • URL 不能包含空格。URL 编码通常使用 + 来替换空格。

使用举例

前言

      编码问题是JAVA初学者在web开发过程中经常会遇到问题,其中之一是URL中使用中文等非ASCII的字符造成服务器后台程序解析出现乱码的问题。

常见出错部分

也就是容易出现中文字符的部分:

  1. Query String中的参数值
  2. servlet path

常见出错原因

  1. 浏览器:我们的客户端(浏览器)本身并没有遵循URI编码的规范。
  2. Servlet服务器:Servlet服务器的没有正确配置。
  3. 开发人员并不了解Servlet的规范和API的含义。

servlet规范

  1. HttpServletRequest.setCharacterEncoding()方法 仅仅只适用于设置post提交的requestboda的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。
  2. HttpServletRequest.getPathInfo()返回的结果是由Servlet服务器解码(decode)过的。
  3. HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。
  4. POST提交的数据是作为request body的一部分。

网页的Http头中ContentType("text/html; charset=GBK")的作用:

  • 告诉浏览器网页中数据是什么编码;
  • 表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。

注意:这里所说的ContentType是指http头的ContentType,而不是在网页中mete中的ContentType。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你的问题是如何让前端页面显示 UTF-8 文字,同时在查看页面源代码时显示 ASCII 转码字符串。 首先,在你的 HTML 页面中,需要添加以下 meta 标签,指定页面使用 UTF-8 编码: ```html <meta charset="UTF-8"> ``` 接下来,在你的后端代码中,需要确保你的数据在传输到前端时已经被正确编码UTF-8。在 PHP 中,可以使用 `utf8_encode` 函数将字符串转换为 UTF-8 编码: ```php $utf8_string = utf8_encode($ascii_string); ``` 在前端页面中,你可以直接使用这个 UTF-8 编码的字符串,例如: ```html <div><?php echo $utf8_string; ?></div> ``` 这样,页面就能正确显示 UTF-8 文字了。但是,如果你查看页面源代码,你会发现字符串仍然被转码成 ASCII 字符串。这是因为浏览器会将特定的字符转义成 HTML 实体,以确保页面的正确性和安全性。 如果你希望在查看页面源代码时看到原始的 UTF-8 字符串,你可以使用 JavaScript 将 HTML 实体转换回原始字符。以下是一个简单的 JavaScript 函数,可以将 HTML 实体转换为原始字符: ```javascript function decodeHtml(html) { var txt = document.createElement("textarea"); txt.innerHTML = html; return txt.value; } ``` 在你的前端页面中,你可以这样使用这个函数: ```html <div id="utf8-string"><?php echo $utf8_string; ?></div> <script> var utf8String = document.getElementById("utf8-string").innerHTML; var decodedString = decodeHtml(utf8String); console.log(decodedString); </script> ``` 这样,在控制台中,你就可以看到原始的 UTF-8 字符串了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值