2019独角兽企业重金招聘Python工程师标准>>>


很多国际化应用的让我理解了这么一个道理:Unicode是为更方便的做国际化应用设计的,而Java核心的字符是基于UNICODE的,这一机制为应用提供了对中文“字”的控制(而不是字节)。但如果不仔细理解其中的规范,这种自由反而会成为累赘,从而导致更多的乱码问题

什么是编码页(code page)?
正如我们所知,计算机只懂得数值。因此,当我们想要它处理文本时,就把一门语言中每个字符都赋以特定的值。简单地说来,这种字符与数值的对照表就叫编码页。在这种情况下,你可能常会听到诸如字符集(charset),字符表(charmap),编码(encoding),编码字符集(coded character set)等术语。虽然彼此间还有一些细微的差异,为理解的目的你可以认为它们都是指每种语言的字符、数值映射表。ASCII编码页就是一个很著名的例子,它把英文字母表和一些控制字符映射到一些特定的数值上去。

还有哪些编码页?围绕着编码页有哪些问题?
ASCII编码映射了127个字符,因此7位(bit)二进制数足够用来表示127个字符。程序则典型地在8位的缓冲区内处理文本。这在处理其它的语言的编码页是会出问题。例如日语这种语言,有成千让万个字符,8位二制只能表示256个不同的字符,不可能唯一地表示每一个日语字符。因此,人们用几个字节来表示一个日语字符。现在,我们又遇到另一个问题。缓冲区的字节数不等于缓冲区中的字符数。每一个简单地字符串操作,都需要将字节组装成字符。
认识到这种复杂性,开发人员利用一种叫宽字符(wide-character)的技术来处理外语字符串。宽字符基本上是16位或32位的数据类型。容量够大,能满足亚洲语言的需求。处理字符串不再使用8位的缓冲区(char *),而是使用16位的缓冲(unsigned short *)。因此每次移动指针,你都可以保证跳过了一个字符(而不是原先那可能是半个)。
不同的开发商使用不同的编码页,给这带来了混乱。也就是说,同一个日语字符,在一个机器上可能用0x95和0x5c两个字节表示,而在另外的机器的上则可能是0xc9和0xbd。这样一事每次交换数据都要进行一次转换(称为码表转换(charmap conversion)或码集转换(codeset conversion))。

什么是Unicode?它是如何解决这个问题的?
每一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。因而人们制定了一个世界标准,叫做unicode( http://www.unicode.org).Unicode为每个字符提供了唯一的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就是说,它世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数值。

什么是UTF-8?它与UNICODE是一回事吗?
Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题(implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。
因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41.
UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常重要。Unicdoe相关的技术介绍参见 http://www.unicode.org/unicode/standard/principles.html.

话说这个VB6,很是无耻,居然内置了支持Unicode的功能,也就是说,当你读入一个字符串时,它根据本地缺省语言的对应关系将之转换为Unicode,输出时,再从Unicode转换为本地编码。一方面,它当然方便啦,随便出个什么语言的版本都好方便的,而且在Unicode的系统上,如NT,那它可就如鱼得水,Unicode毕竟是软件发展的方向,像现在中文Win9X使用的GBK内码,实际上就是向着Unicode走了一大步。可是在另一方面,这种支持实际上极大地延缓了字符串的处理时间!想想看,如果我们从文件里读一行并显示,本来是很简单的事情,可是在VB6里面,实际上多了一段转换到Unicode的时间,如果我们用字符串从原文件里读一行,然后分析,再写到目的文件里去,实际上就多了两重的时间(本地到Unicode,unicode到本地)。当然对于这种小事,高手们想必也都有处理的办法(如用byte数组来代替字符串)
说了这么一大堆Unicode的坏话,还没说到正题呢,由于VB6内置对Unicode的支持,而Unicode里面分别和 GBK 以及Big5汉字都有对应关系,所以要实现转换也只是一件小事,下面我们就有请本次女主角出场。(哗哗哗哗……掌声不绝。)
函数strConv! 这个美眉大家可能在VB5里面也都见过的,她有一些保镖,可以帮她把字符串在Unicode和本地编码之间转换,而在VB6里面呢,strConv又多了一个保镖!大家请仔细看:
strConv(string,conversion) `VB5
StrConv(string,conversion,LCID) `VB6

Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式 
是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节. 
Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度, 
可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是 
public static ByteToCharConverter getDefault() ; 
public static ByteToCharConverter getConverter(String encoding); 
如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用 
8859_1 
 
我们来就一个简单的例子: 
"你"的gb码是:0xC4E3 ,unicode是0x4F60 
你用: 
--encoding="gb2312"; 
--byte b[]={(byte)"u00c4",(byte)"u00E3"}; 
--convertor=ByteToCharConverter.getConverter(encoding); 
--char [] c=converter.convertAll(b); 
--for(int i=0;i0xC4,0x00E3->0xE3,因此0xC4,0xE3被放进了 
1.网页传参数不提倡用get方法,而且用户可以调整是否用utf-8发送 /// 这一行要注意了
2.建议jsp中最好不要用,实际上加不加这句都有实现中文正常显示的方案,我认为不加方便些,至少不用写这些代码,如下的配置我认为可以使中文正常显示: 
a.所有的javabean用iso8859-1编译 
b.jsp文件中不要写以上charset=gb2312的语句(写了反而错)

这段更重要了,做后台sql的都看看吧

我们的目标是,任一国家的客户端通过Form向Server发送信息,Server把信息存入数据库中,客户端在检索时仍然能够看到自己发送的正确信息。事实上,我们要保证,最终Server中的SQL语句中保存的时包含客户端发送文字的正确Unicode编码;DBC与数据库通讯时采用的编码方式能包含客户端发送的文字信息,事实上,最好让JDBC直接使用UNICODE/UTF8与数据库通讯!这样就可以确保不会丢失信息;Server向客户端发送的信息时也要采用不丢失信息的编码方式,也可以是Unicode/Utf8。 
如果不指定Form的Enctype属性,Form将把输入的内容依照当前页面的编码字符集urlencode之后再提交,服务器端得到是urlencoding的字符串。编码后得到的urlencoding字符串是与页面的编码相关的,如gb2312编码的页面提交"中文测试",得到的是"%D6%D0%CE%C4%B2%E2%CA%D4",每个"%"后跟的是16进制的字符串;而在UTF8编码时得到的却是"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95",因为GB2312编码中一个汉字是16位的,而UTF8中一个汉字却是24位的。中日韩三国的ie4以上浏览器均支持UTF8编码,这种方案肯定包涵了这三国语言,所以我们如果让Html页面使用UTF8编码那么将至少可以支持这三国语言。 
但是,如果我们html/Jsp页面使用UTF8编码,因为应用程序服务器可能不知道这种情况,因为如果浏览器发送的信息不包含charset信息,至多Server知道读到Accept-Language请求投标,我们知道仅靠这个投标是不能获知浏览器所采用编码的,所以应用程序服务器不能正确解析提交的内容,为什么?因为Java中的所有字符串都是Unicode16位编码的,HttpServletRequest.request(String)的功能就是把客户端提交的Urlencode编码的信息转为Unicode字符串,有些Server只能认为客户端的编码和Server平台相同,简单地使用URLDecoder.decode(String)方法直接解码,如果客户端编码恰好和Server相同,那么就可以得到正确地字符串,否则,如果提交地字符串中包含了当地字符,那么将会导致垃圾信息。

转载于:https://my.oschina.net/scofi06/blog/7182

关于编码、unicode、utf-8的讨论相关推荐

  1. 各种编码UNICODE、UTF-8、ANSI、ASCII、GB2312、GBK详解

    GBK,ISO-8859-1,GB2312的本质区别 编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标 ...

  2. 字符编码 unicode 及其在javascript 中的使用

    一.javascript 使用 unicode16 字符集,可以使用中文变量名和函数名 计算机使用 8 位(bit)二进制表示一个字节(Byte),计算机内存最小寻址单位就是 1 字节. 早期为了在计 ...

  3. 编码 unicode 及其在 javascript 中的使用

    编码 unicode 及其在 javascript 中的使用 一.javascript 使用 unicode16 字符集,可以使用中文变量名和函数名 计算机使用 8 位(bit)二进制表示一个字节(B ...

  4. 编码Unicode与解码

      1.编码(Unicode)     unicode(统一码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode为每种语言中的每个字符设定了统一并且唯一的二进制编码,以 ...

  5. python中unicode编码表_Python中的字符串操作和编码Unicode详解

    本文主要给大家介绍了关于 Python中的字符串操作和编码Unicode的一些知识,下面话不多说,需要的朋友们下面来一起学习吧. 字符串类型 str:Unicode字符串.采用''或者r''构造的字符 ...

  6. mac 文本编辑器 文本编码Unicode utf-8 不适用的问题

    在mac上使用默认的文本编辑器打开下载的xx.txt文件,如果文本是gbk的编码可能会出现 文本编码Unicode utf-8 不适用的打开错误,如下图 解决方式: 文本编辑---偏好设置-----打 ...

  7. 引用 字库编码Unicode相关知识

    引用 weifeng.shen 的 字库编码Unicode相关知识 1.      各地编码 首先说明一下现在常用的一些编码方案: 1.         在中国,大陆最常用的就是GBK18030编码, ...

  8. html转换编码格式,html编码转换 html编码设置utf gbk编码转换图文教程

    html编码转换 html编码设置utf gbk编码转换图文教程篇 常用HTML编码之urf-8编码转换为gb2312编码或者gb2312转换为utf-8编码快速转换设置,这里DIVCSS5介绍使用D ...

  9. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

最新文章

  1. Thunk 函数的含义和用法
  2. $(document).ready() $(window).load 及js的window.onload
  3. OpenCASCADE:形状愈合之修复
  4. java excel转word表格_java利用poi生成/读取excel表格、生成word
  5. UML类图与类间六种关系表示
  6. java中钩子方法 addShutdownHook 学习使用
  7. python excel 数据匹配实现vlookup功能_如何用python实现excel中的vlookup功能?
  8. Android官方命令深入分析之虚拟机
  9. 逻辑斯蒂回归java_机器学习 (五)逻辑斯蒂回归
  10. 导出csv文件数字会自动变科学计数法的解决方式
  11. C#中要使ListBox使用AddRange()时,能够触发SelectedValueChanged事件
  12. 使用Docker+Jenkins自动构建部署
  13. WIN7安装VS2008的 Error1935 问题解决方案
  14. java cmyk转rgb_Java实现把cmyk格式图片转换为RGB格式图片
  15. 数理统计SPSS软件实验报告一--描述性统计
  16. Rxjava个人摘抄笔记
  17. 一周上手flutter
  18. Linux C++ 信号量学习 sem_init sem_post sem_wait sem_timedwait
  19. 好用的在线奖状生成工具推荐!
  20. JavaScript交互式网页设计简介

热门文章

  1. 利用jsoncpp将json字符串转换为Vector
  2. 溃不成军:科通芯城一度再跌近30% 股价三天腰斩
  3. js 的try catch应用
  4. 手机上 a 标签妙用
  5. 列执行MSSQL Server 处理Null
  6. 个人管理:简单,我微博中的一句话,总有你喜欢的
  7. mongoDB 文档操作_改
  8. CF912D Fishes 期望
  9. Java中程序初始化的顺序
  10. centos 升级cmake from 2.* to 3.*