编程中的字符集,与编码方式
1.Charset字符集,如英文字符集,中文简体字符集.
2.Encoding编码。计算机要处理各种字符,就需要将字符和二进制内码一一对应起来,这种对应关系就是字符编码(Encoding)。制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。如UNICODE 字符集可以用utf-8, utf-16等编码方式。简体中文有GBK和GB 18030等编码方式。
一. Html, JSP 页面编码是:
JSP: <@page>中的Content-Type属性决定,如果没有设置,则由<@page>中的pageEncoding性决定。默认的ISO-8859-1。
其中的pageEncoding的内容只是用于jsp文件输出时的编码,即jsp编译成.java,它会根据pageEncoding的设定读取jsp。因此应将pageEncoding设置为存储jsp文件时使用的编码方式。
Servlet: 使用response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置。
Html: apache有一个AddDefaultCharset可以强制指定的网页的编码, 如果apache没有设置,那么将采用html页面中meta信息中的设置<meta http-equiv="content-type" content="text/html; charset=GBK">。
这里需要注意html文件保存编码方式必须同html meta信息中的设置 charset一致,否则出现解码不一致就会产生乱码。
二.URL编码
浏览器会对URL进行URL encode,然后发送给服务器IE默认方式总以UTF-8发送,因此如果地址中有中文包括请求参数,就有必要对url进行encoding。 这里看到杨争的一篇文章:深入浅出URL编码 http://blog.csdn.net/yzhz/archive/2007/07/03/1676796.aspx
三.Ajax请求中的编码
为 encodeURIComponent会对参数做utf-8编码,同时对一些特殊字符做转义。同时需要设置ajax请求的charset=UTF-8
四.java对字符的处理
在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。
1. getBytes(charset)这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。字符串在java内存中总是按unicode编码存储的。比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。
2. new String(byte[], charset)这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别。
五.Mysql 数据库编码。
使用dos链接mysql:
使用MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集。生意经项目将
可以使用 在 windows 中 dos 中 mysql -uroot --default-character-set=gbk , 或者链接后运行set charset gbk;...连接方式 (注意 在Windows 下 不管你的数据是什么格式的 都得用gbk ,原因是 dos 中文只支持 gbk
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数
SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.00 sec)
a、client是客户端向服务器端发送请求使用的字符集编码.
b、connection是连接数据库的字符集设置类型.
c、database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
d、results是数据库给客户端返回时使用的字符集设定。
e、server是服务器安装时指定的默认字符集设定。
f、system是数据库系统使用的字符集设定。
MySQL支持字符集转换,使用客服端发送查询语句的时候:
客户端
--> 将sql语句以character_set_client编码发送请求
-->到达服务器端后将编码转变为 character_set_connection类型的编码
-->数据库服务器内部执行处理
-->最后服务器将查询结果以 character_set_results格式的编码返回给客服端
由此可以看到,客户端的语句用能正确的别执行,就要sql语句采用同character_set_client对应的编码方式。 而客户端要正确查看指向的结果,就要以character_set_results来解析服务器的返回结果。 而character_set_connection只是一个中间环节的编码,只要保证重 character_set_client编码转变为character_set_connection编码没有信心丢失即可。
需要注意的是我们设置客户端连接数据库是,采用的字符集编码方式,必须是数据库服务器能够识别。 MySQL服务器能够支持多种字符集,可以使用SHOW CHARACTER SET语句列出可用的字符集。
以攻略项目数据库为例:
1.客服端为java应用程序:
攻略数据库knowledge编码是utf8的格式。在使用java应用的数据源中url是jdbc:mysql://10.20.135.208:3306/knowledge?user=knowledge&password=knowledge&useUnicode=true&characterEncoding=utf-8
其中characterEncoding=utf-8会将 上表中的character_set_client和character_set_connection设置为utf8。由于目前攻略只处理到中文字符,因此将数据库链接中的characterEncoding设置为gbk,中文、英文也能正常显示,但是其他文字如日文先生就是乱码了。
2. 客服端为中文dos:
在中文dos下默认情况中连接上数据库直接查询出来的数据是乱码, 因为中文dos只支持gbk编码, 因此必须将character_set_client设置为GBK这样在dos中输入带中文字符的SQL语句才能别数据库服务器正确解析;同时character_set_resultsye也必须设置gbk,这样返回的查询结果才能正确显示中文;而character_set_connection可以是gbk,也可以为utf8,只要编码转换不会使信息丢失即可。