如何处理getpost提交的中文乱码问题

如何处理getpost提交的中文乱码问题,第1张

解决中文乱码的4种方法

一、JSP页面显示乱码

下面的显示页面(displayjsp)就出现乱码:

程序代码

<html>

<head>

<title>JSP的中文处理</title>

<meta >

再解决post请求乱码问题,在web项目的webxml最开始加上:

再看看你的页面的编码问题:

a若是jsp页面

b若是html页面

4 最后还是没解决,修改数据库的编码问题:

在mysql的连接文件properties的中的jdbcurl最后面加上

?characterEncoding=utf-8&allowMultiQueries=true

如下图所示:

若有帮助,记得点赞,若能关注,最好点个关注,谢谢!

pl/sql developer 中文字段显示乱码:

原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的。

解决方法如下:

一、查看和修改oracle数据库字符集

select userenv('language') from dual;

二、修改pl/sql developer 的编码格式:

在windows中创建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINAZHS16GBK”,然后重新启动 pl/sql developer,这样检索出来的中文内容就不会是乱码了。

如果想转换为UTF8字符集,可以赋予“NLS_LANG”为 “AMERICAN_AMERICAUTF8”,然后重新启动 pl/sql developer。其它字符集设置同上。

扩展资料:

ORACLE数据库常见问题及诊断方法 :

1,ORA-12571、ORA-03113、ORA-03114、ORA-01041

特征:

客户端(代理或应用服务器)有时报这类断连错误。

原因:

如果偶尔出现一次,则可能为网络原因或用户异常中止,如果经常出现则为客户端与服务端的字符集不一致。    

措施:

如果偶尔出现,可在服务端的协议配置文件PROTOCOLORA中增加一行TCPNODELAY=YES。

如果经常出现,则为客户端与服务端字符集不一致或网络原因。客户端的字符集在注册表里定义:HKEY__LOCAL__MACHINE/SOFTWARE/ORACLE/NLS__LANG。在客户端注册表中的TCP参数项中设置TCPMAXDATARETRANSMITIONS=20。

2,ORA-01000   

特征:

达到会话允许的最大游标数。 

原因:

达到会话允许的最大游标数。   

措施:

在初始化文件INITORA文件中增加OPEN_CURSORS的数量,一般要求大于200。

oracle数据库服务器系统使用的是UTF-8编码或者是AL32UTF8编码

在Web应用中已经将请求编码设置为UTF-8编码

二进制数据的取得

Blob blogObj = rstgetBlob("CONTENT");

if(blogObj!=null){

byte[] content = blogObjgetBytes(1, (int) blogObjlength());

try {

newssetContent(new String(content));

} catch (UnsupportedEncodingException e) {

eprintStackTrace();

}

}

乱码问题的解决方法:

newssetContent(new String(content,“UTF-8”));

之后就不会出现乱码问题。

MySQL会出现中文乱码的原因不外乎下列几点:

1server本身设定问题。

2table的语系设定问题(包含character与collation)

3客户端程式(例如php)的连线语系设定问题强烈建议使用utf8。utf8可以兼容世界上所有字符!

一、避免创建数据库及表出现中文乱码和查看编码方法

1、创建数据库的时候:CREATE DATABASE `test`

CHARACTER SET 'utf8'

COLLATE 'utf8_general_ci';

2、建表的时候 CREATE TABLE `database_user` (

`ID` varchar(40) NOT NULL default '',

`UserID` varchar(40) NOT NULL default '',

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这2个设置好了,基本就不会出问题了,即建库和建表时都使用相同的编码格式。

但是如果已经建了库和表可以通过以下方式进行查询。

1查看默认的编码格式:

mysql> show variables like "%char%";

+--------------------------+---------------+

| Variable_name | Value |

+--------------------------+---------------+

| character_set_client | gbk |

| character_set_connection | gbk |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | gbk |

| character_set_server | utf8 |

| character_set_system | utf8 |

+--------------------------+-------------+

注:以前2个来确定,可以使用set names utf8,set names gbk设置默认的编码格式;

执行SET NAMES utf8的效果等同于同时设定如下:

SET character_set_client='utf8';

SET character_set_connection='utf8';

SET character_set_results='utf8';

2查看test数据库的编码格式:

mysql> show create database test;

+------------+------------------------------------------------------------------------------------------------+

| Database | Create Database |

+------------+------------------------------------------------------------------------------------------------+

| test | CREATE DATABASE `test` /!40100 DEFAULT CHARACTER SET gbk / |

+------------+------------------------------------------------------------------------------------------------+

3查看yjdb数据库的编码格式:

mysql> show create table yjdb;

| yjdb | CREATE TABLE `yjdb` (

`sn` int(5) NOT NULL AUTO_INCREMENT,

`type` varchar(10) NOT NULL,

`brc` varchar(6) NOT NULL,

`teller` int(6) NOT NULL,

`telname` varchar(10) NOT NULL,

`date` int(10) NOT NULL,

`count` int(6) NOT NULL,

`back` int(10) NOT NULL,

PRIMARY KEY (`sn`),

UNIQUE KEY `sn` (`sn`),

UNIQUE KEY `sn_2` (`sn`)

) ENGINE=MyISAM AUTO_INCREMENT=1826 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC |

二、避免导入数据有中文乱码的问题

1:将数据编码格式保存为utf-8

设置默认编码为utf8:

set names utf8;

设置数据库db_name默认为utf8:

ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

设置表tb_name默认编码为utf8:

ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

导入:

LOAD DATA LOCAL INFILE 'C:\\utf8txt' INTO TABLE yjdb;

2:将数据编码格式保存为ansi(即GBK或GB2312)

设置默认编码为gbk:

set names gbk;

设置数据库db_name默认编码为gbk:

ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

设置表tb_name默认编码为gbk:

ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

导入:

LOAD DATA LOCAL INFILE 'C:\\gbktxt' INTO TABLE yjdb;

注:1UTF8不要导入gbk,gbk不要导入UTF8;

2dos下不支持UTF8的显示;

三、解决网页中乱码的问题

将网站编码设为 utf-8,这样可以兼容世界上所有字符。

如果网站已经运作了好久,已有很多旧数据,不能再更改简体中文的设定,那么建议将页面的编码设为 GBK, GBK与GB2312的区别就在于:GBK能比GB2312显示更多的字符,要显示简体码的繁体字,就只能用GBK。

1编辑/etc/mycnf ,在[mysql]段加入default_character_set=utf8;

2在编写Connection URL时,加上useUnicode=true&characterEncoding=utf-8参;

3在网页代码中加上一个"set names utf8"或者"set names gbk"的指令,告诉MySQL连线内容都要使用utf8或者gbk。

修改数据库字符集:确定数据库的字符集,在MySQL安装的时候,可以配置MySQL的字符集,如果最好是选择UTF-8存储

或者直接修改MySQL配置文件myini

修改页面字符集:如果数据库字符集没有乱码问题,则检查我们写的JSP页面,是否加入了pageEncoding="UTF-8",

以及在head标签里面,metadata里面配置属性contentType=text/html;charset=UTF-8

配置字符过滤器:webxml配置spring字符集过滤器或者自定义过滤器为UTF-8

4

配置WEB服务器字符集:最后还有乱码,则修改tomcat配置文件serverxml 之connector标签,添加属性URIEncoding="UTF-8"

① 首先把MySQL的服务停掉 在运行窗口输入:net stop mysql

② 把服务器和客户端的字符集改成自己想用的字符集:GB2312或是utf8等……

具体 *** 作为:打开mysql安装目录下的myini;

找到default-character-set,将其改为自己想用的字符集:GB2312或是utf8等……,要注意的是这里有两个default-character-set,用ctrl+f定位在文件最前面输入default就会找到,都要改过来;

③ 重启MySQL服务器,在运行窗口输入:net start mysql

④ 最重要的是一点是,到这里我们已经能够解决乱码问题了,可问题是我们依然还会出现乱码问题,这是因为我们现在的表被创建的时候用的是默认的字符集(latin1),所以这时候我们要把表删除,然后重建就可以了

最后用到的一句代码是:

<%= new String(rstgetString(2)getBytes("ISO-8859-1"),"gb2312")%>

大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。

一、JSP页面显示乱码

下面的显示页面(displayjsp)就出现乱码:

对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一行加上:,就可以消除乱码了。完整页面如下:

二、表单提交中文时出现乱码

下面是一个提交页面(submitjsp),代码如下:

下面是处理页面(processjsp)代码:

如果submitjsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过requestseCharacterEncoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的processjsp代码如下:

三、数据库连接出现乱码

只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBK就OK了。

四、数据库的显示乱码

在mysql410中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:

public class Convert {

/ 把ISO-8859-1码转换成GB2312

/

public static String ISOtoGB(String iso){

String gb;

try{

if(isoequals("") || iso == null){

return "";

}

else{

iso = isotrim();

gb = new String(isogetBytes("ISO-8859-1"),"GB2312");

return gb;

}

}

catch(Exception e){

Systemerrprint("编码转换错误:"+egetMessage());

return "";

}

}

}

把它编译成class,就可以调用Convert类的静态方法ISOtoGB()来转换编码。

和Java一样,JSP是目前比较热门的一个话题。它是一种在服务器端编译执行的Web设计语言,因为脚本语言采用了Java,所以JSP继承了Java的所有优点。可是在使用JSP程序的过程中,常遇到中文乱码问题,很多人为此头疼不已,笔者就深受其害,而且使用平台不同,中文乱码问题的解决方法也不同,无形中增加了学习JSP的难度。其实,在彻底了解相关原因后,问题还是比较容易解决的。笔者结合自己的工作实践,对中文显示问题进行了一定的研究,并在不同的环境下进行了相关测试,以下是笔者总结的解决方法,相信对读者会有一定的借鉴意义。

字符内码

每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码、中国的GB2312-80、日本的 JIS 等,作为该国家(区域)信息处理的基础,有着统一编码的重要作用。由于各本地字符集代码范围重叠,相互间信息交换困难,软件本地化版本独立维护成本较高。因此有必要将本地化工作中的共性抽取出来,做一致性处理,将特殊的本地化处理内容降低到最少,这就是所谓的国际化(I18N)。各种语言信息被规范为本地信息,而底层字符集采用包含了所有字符的Unicode。

字符内码(character code)指的是用来代表字符的内码。我们在输入和存储文档时都要使用内码,内码分为单字节内码和双字节内码。单字节内码的英文全称是Single-Byte Character Sets (SBCS),可以支持256个字符编码;双字节内码的英文全称是Double-Byte Character Sets(DBCS),可以支持65000个字符编码,主要用来对大字符集的东方文字进行编码。

CodePage指的是一个经过挑选的以特定顺序排列的字符内码列表,对于早期的单字节内码的语种,CodePage中的内码顺序使得系统可以按照此列表来根据键盘的输入值给出一个对应的内码。对于双字节内码,给出的是MultiByte到Unicode的对应表,这样就可以把以Unicode形式存放的字符转化为相应的字符内码。引入对CodePage的支持主要是为了访问多语种文件名,目前在NTFS和FAT32/VFAT下的文件系统上都使用Unicode,这需要系统在读取这些文件名时动态地将其转换为相应的语言编码。

相信了解JSP代码的读者对ISO8859-1一定不陌生,ISO8859-1是我们平时使用比较多的一个CodePage,它属于西欧语系。GB2312-80 是在国内计算机汉字信息技术发展初始阶段制订的,其中包含了大部分常用的一、二级汉字和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。

GBK 是 GB2312-80 的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是 0x8140~0xFEFE,剔除高位 0x80 的字位,其所有字符都可以一对一映射到 Unicode 20,也就是说 Java 实际上提供了对 GBK 字符集的支持。

>GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的文字。GBK2K 从根本上解决了字位不够、字形不足的问题。

不同开发平台的区别

1.Tomcat 4开发平台

Windows 98/2000下的Tomcat 4以上版本都会出现中文问题(而在Linux下和Tomcat 3x中则没有问题),主要表现是页面显示乱码。在IE中调整字符集为GB2312,就可以正常显示了。

为解决这个问题,可在每个JSP的页面开始处加上。不过,这还不够,虽然这时显示了中文,但是发现从数据库读出的字段变成了乱码。经过分析发现: 在数据库中保存的中文字符是正常的,数据库用ISO8859-1字符集存取数据,而Java程序在处理字符时默认采用统一的ISO8859-1字符集(这也体现了Java国际化思想),所以在数据添加的时候Java和数据库都是以ISO8859-1方式处理,这样不会出错。但是在读取数据的时候就出现问题了,因为数据读出也采用ISO8859-1字符集,而 JSP的文件头中有语句,这说明页面采用GB2312的字符集显示,这样就和读出的数据不一样。这时页面显示从数据库中读出的字符是乱码,解决的方法是对这些字符转码,从ISO8859-1转成GB2312,就可以正常显示了。这个解决办法对很多平台具有通用性,读者可以灵活运用。

2.Tomcat 3x、Resin及Linux平台

在Tomcat 3x、Resin中或是在Linux下,没有加入语句,而页面中的语句起了作用,此时可以正常显示。相反,如果加上系统会报错,说明Tomcat 4以上版本的引擎在处理JSP时还是有差别的。

另外,对于不同的数据库如SQL Server,Oracle,Mysql,Sybase等,字符集的选择很重要。如果考虑多语言版本,数据库的字符集就应该统一采用ISO8859-1,需要输出的时候在不同的字符集之间做转换就可以了。

以下是针对不同平台的总结:

(1) JSWDK只适合于普通开发,稳定性和其他问题可能不如商业软件。 由于JDK 13版性能要好于JDK 122很多,并且对中文的支持也较好,所以应该尽量采用。

(2) 作为免费的商业软件,Resin不仅速度快、稳定、自动编译,还可以指出出错行,并可在服务器端支持使用JavaScript等,而且对中文的支持也很好。

(3) Tomcat仅仅是一个对JSP 11、Servlet 22标准的实现, 我们不应该要求这个免费软件在细节和性能上都面面俱到, 它主要考虑英文用户, 这也是为什么不做特殊转换,汉字用URL方法传递就有问题的原因。大部分IE浏览器缺省始终以UTF-8发送, 这似乎是Tomcat的一个不足, 另外Tomcat不管当前的 *** 作系统是什么语言, 都按ISO8859去编译JSP, 似乎也欠妥。

JSP代码的中文处理

在JSP代码中以下几处经常需要涉及到中文处理:

1 在URL中附带中文参数。这里中文参数通常可以直接读取,例如:

2 在JSWDK中读取HTML表单提交的中文值这时需要加以编码,较为简洁的写法是:

String name1=new String(requestgetParameter(“user_id”)getBytes(“ISO8859_1”))。

另外,在JDK 13的支持下,不需加入 ,而在JDK 122 以下,即使以上两种方法同时运用也很不稳定。但在Resin平台,情况较好,只要在页面第一行加入:即可正确处理中文,如果再加代码则反而不对。

3.在JSWDK中Session包含的中文,如果从表单中读出的值经过编码可正确显示,但直接赋予中文值则不行,而Resin平台则很好。

4 在编译Servlet和JSP时加入代码选项。在编译Servlet时使用Java-Encoding ISO8859-1 myservletjava;在JSP的ZONE配置文件中,修改编译参数为:Compiler=builtin - javac- encoding ISO8859-1。使用这种方法后,不需要做其他的改动就可以正常显示中文了。

另外,流行的关系数据库系统都支持数据库Encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有 Encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性。 GB2312、GBK、UTF-8 等都是可选的数据库 Encoding,也可以选择 ISO8859-1 (8-bit), 但会增加了编程的复杂度,ISO8859-1不是推荐的数据库 Encoding。在JSP/Servlet编程时,可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。

处理方法实例

下面是两个具体的中文乱码解决实例,读者仔细研究后可能会有所收获。

1.常见的字符转换方法

将Form 中 的 值 传 送 到 数 据 库 中 再 取 出 来 后 全 变 成 了“?”。Form用POST提交数据,代码中使用了语句:String st=new(requestgetParameter(“name”)getBytes(“ISO8859_1”)), 而且也声明了charset=gb2312。

要处理Form中传递的中文参数,应该在JSP中加入下面的代码,另外定义一个专门解决这个问题的getStr类,然后对接收到的参数进行转换:

String keyword1=requestgetParameter(“keyword1”);

keyword1=getStr(keyword1);

这样就可以解决问题了,代码如下:

2 JDBC Driver的字符转换

目前大多数JDBC Driver采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41”和“0x75”进行传输。因此需要对JDBC Driver返回的字符以及要发给JDBC Driver的字符进行转换。当用JDBC Driver向数据库中插入数据时,需要先将Unicode转成Native code; 当 JDBC Driver从数据库中查询数据时,则需要将Native code转换成Unicode。下面给出了这两种转换的实现:

String native2Unicode(String s) {

if (s == null || slength() == 0) {

return null;

}

byte[] buffer = new byte[slength()];

for (int i = 0; i slength(); i++) { if (scharAt(i)>= 0x100) {

c = scharAt(i);

byte []buf = (“”+c)getBytes();

buffer[j++] = (char)buf[0];

buffer[j++] = (char)buf[1];

}

else {buffer[j++] = scharAt(i);}

}

return new String(buffer, 0, j);

}

要注意的是,有些JDBC Driver如果通过JDBC Driver Manager设置了正确的字符集属性,以上方法就不需要了。具体情况可参考相关JDBC的资料。

以上就是关于如何处理get/post提交的中文乱码问题全部的内容,包括:如何处理get/post提交的中文乱码问题、MySQL中文乱码怎么办、pl/sql developer中文乱码,为什么呢怎么解决Oracle问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9320194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存