编码问题

编程中的字符集,与编码方式

1.Charset字符集,如英文字符集,中文简体字符集.

2.Encoding编码。计算机要处理各种字符,就需要将字符和二进制内码一一对应起来,这种对应关系就是字符编码(Encoding)。制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。如UNICODE 字符集可以用utf-8, utf-16等编码方式。简体中文有GBKGB 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)

aclient是客户端向服务器端发送请求使用的字符集编码.

bconnection是连接数据库的字符集设置类型.

cdatabase是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。

dresults是数据库给客户端返回时使用的字符集设定。

eserver是服务器安装时指定的默认字符集设定。

fsystem是数据库系统使用的字符集设定。

 

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应用的数据源中urljdbc:mysql://10.20.135.208:3306/knowledge?user=knowledge&password=knowledge&useUnicode=true&characterEncoding=utf-8

其中characterEncoding=utf-8会将 上表中的character_set_clientcharacter_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,只要编码转换不会使信息丢失即可。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值