`
wu_quanyin
  • 浏览: 208130 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

JAVA编码问题记录

    博客分类:
  • J2SE
 
阅读更多

一,在web开发中,比较常遇到的就是get post乱码问题

解决方案:

1,get请求时,参数会得到乱码主要原因取决与当前浏览器的页面是怎么编码,如假设是UTF-8编码,在浏览器地址栏请求时,浏览器会对url进行URLEncoder.encode(url, "utf-8")进行编码,然后相对应的服务器,会根据后台配置

 

tomcat参数串的编码是根据contentType里面的值进行编码的

 

如:tomcat

 

URIEncoding

This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

useBodyEncodingForURI

This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is  false .

如果http请求中,在contentType中指定了编码方式,那么将采用contentType的编码方式去解码url之后的查询参数,将忽略URIEncoding的配置.

所以在get请求时,如果contentType指定了编码方式,将会带来一定的问题(最大的问题就是,服务器端对查询字符串的编码方式无法统一),最后我决定让 useBodyEncodingForURI 参数保持默认(false):即所有的URL查询字符串的编码采用URIEncoding的参数(UTF-8),服务器端编码保持原来的统一方式.

 

<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75" 
enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" 
connectionTimeout="20000" disableUploadTimeout="true"   URIEncoding="utf-8"/>

 进行相应的decode而达到编码的一致性,所以如果两者不一致,就会出现乱码问题

 

     2,post请求,只要写个对应的过滤器,就可解决乱码问题

 

if (this.encoding != null && request.getCharacterEncoding() == null){
			
	request.setCharacterEncoding(this.encoding);
}
		
filterChain.doFilter(request, response);

 http post时会对表单值进行encode,服务端会进行decode

 

二,要解决乱码问题,就要达到一整个流程用的都是统一编码,

    1,从页面开始,设置content-type告诉浏览器用怎么编码进行查看

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 

   2,进入后台操作时有有相应的以上get post的请求设置,获取参数一般不会出现乱码 ,而后在返回值时,

response.setContentType("text/html;charset=utf-8");告诉浏览器用怎么进行编码查看响应值

 

三,问题汇总:

 

   1,在开发17173搜索时,由于旧的搜索用的是GBK编码,故其他17173系统在调用搜索数据以及搜索时都是用GBK进行查找。

   2,新的搜索采用的是UTF-8编码,故就不兼容旧的其他的系统的查找。解决方案是重新对旧系统进行规划,把其他系统搜索过来的数据用一套GBK编码的格式的页面进行接收keyword,然后对keyword=URLEncoder.encode(keyword, "utf-8");进行编码,再跳转到utf-8的页面去,进行兼容

 

  3,new String(keyword.getBytes("UTF-8"),"GBK")时,遇到两个字的中文字可以进行强制编码成功,三个字的中文字会出现乱码

 

 

public static void main(String[] args) throws UnsupportedEncodingException {
		// 给定某3个汉字
		String src = "你好啊";
		//String src="一二三";
		// 浏览器进行gbk编码,并传送到服务器
		byte[] bytes1 = src.getBytes("utf-8");
		System.out.println(bytes1.length);// 9
		for (int i = 0; i < bytes1.length; i++) {
			System.out.print(bytes1[i] & 0xff);
			System.out.print("\t");
		}

		// tomcat以gbk方式解码(这个片段的说明仅针对gbk处理汉字的情况)
		// 如果一对汉字字节不符合gbk编码规范,则每个字节使用'?'(ascii 63)代替
		// 万幸的话,只是最后一个(第9个)字节因不能成对,变成问号(比如当src="你好啊"时)
		// 不幸的话,中间某些字节就通不过gbk编码规范出现'?'了(比如当src="一二三"时)
		// 总之temp的最后一位必定是问号'?'
		String temp = new String(bytes1, "gbk");

		// 你的action中的代码
		// 由于以上的tomcat以gbk解释utf-8不能成功
		// 所以此时bytes2和bytes1不一样
		byte[] bytes2 = temp.getBytes("gbk");
		System.out.println(bytes2.length);
	
		System.out.println();
		for (int i = 0; i < bytes2.length; i++) {
			System.out.print(bytes2[i] & 0xff);
			System.out.print("\t");
		}
		System.out.println();

		// 构建出来的dest自然不是原先的src
		String dest = new String(bytes2, "utf-8");
		System.out.println(dest);
	}

 

   4, 在编码未确定的情况下,要先检查该中文是属性于哪一种编码

 

 

    public static String getEncoding(String str) {  
        String encode = "ISO-8859-1";  
        try {  
            if (str.equals(new String(str.getBytes(encode), encode))) {  
                String s1 = encode;  
                return s1;  
            }  
        } catch (Exception exception1) {  
        }  
        encode = "UTF-8";
        try {  
            if (str.equals(new String(str.getBytes(encode), encode))) {  
                String s2 = encode;  
                return s2;  
            }  
        } catch (Exception exception2) {  
        }  
        encode = "GBK";  
        try {  
            if (str.equals(new String(str.getBytes(encode), encode))) {  
                String s3 = encode;  
                return s3;  
            }  
        } catch (Exception exception3) {  
        }  
        return "";  
    }  

 然后根据对应的编码new String(str.getBytes(encode), encode)进行转换,而达到编码转换的目的

 

 

 

5,jdk系统编码,Charset.defaultCharset() 这个获取,而这个的信息就与eclipse页面右键属性中更改其编码方式

 

System.out.println(Charset.defaultCharset());  
		String s="中国";
System.out.println(getEncoding(s));

 

 

 

 

 

 

 

 

 

 

3
5
分享到:
评论
2 楼 wyzxzws 2012-08-21  
小鸟学习了!
1 楼 xiaotao.2010 2012-08-21  
写的不错!
弱弱说一句 建议使用URL二次转码, 这样可以避免 服务器和浏览器的编码不同意的问题!
效果比URL一次转码要好!

相关推荐

    java 解析csv文件例子,csv文件 中文乱码问题

    当处理包含中文字符的CSV文件时,可能会遇到乱码问题,这通常与文件编码设置有关。本篇文章将详细探讨如何在Java中解析CSV文件,并解决中文乱码的问题。 首先,我们需要了解如何使用Java的标准库`java.io`和`java....

    java Socket与C#通信中中文乱码问题的解决方案

    在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致...同时,要注意的是,如果服务器端有日志记录或者数据存储的需求,也需要使用UTF-8编码进行处理,以避免在这些环节再次出现乱码问题。

    java判断编码方式

    在Java编程语言中,判断文件或字符串的编码方式是一个常见的需求。这主要涉及到字符集的概念,如ASCII、ISO-8859-1、UTF-8等,它们...因此,最好的实践是在创建文件或数据时就明确记录编码类型,以避免后期的识别问题。

    JAVA编码规范试题

    JAVA 编码规范试题 JAVA 编码规范试题是一套涵盖了 JAVA 编程规范的试题,旨在帮助开发者掌握 JAVA 编程的基本规范和best practice。该试题涵盖了 JAVA 编程规范的多个方面,包括变量命名、代码格式、异常处理、...

    java做的一下记录本

    【Java编程实现记录本软件】 Java作为一种广泛使用的编程语言,具有跨平台、面向对象的特点,非常适合用来开发各种类型的应用程序,包括记录本这样的小型实用工具。在这个“java做的一下记录本”项目中,开发者利用...

    Huffman编码的java实现

    为每个节点(即字符)记录从根到该节点的路径,得到的就是字符的Huffman编码。 4. **压缩数据**:有了字符的Huffman编码,我们就可以将输入文本转换为二进制编码。遍历文本,将每个字符替换为其对应的二进制串,...

    java编码规范考试题答案.doc

    "java编码规范考试题答案" 一、Java编码规范考试题答案 本文档涵盖了Java编码规范的各种方面,包括集合类、线程、对称密码算法、异常处理、命名规范、随机数生成、压缩文件解压、安全编程规范、操作系统登录用户名...

    游程编码 JAVA 代码

    Java 代码实现游程编码,首先需要遍历图像的每个像素,记录当前像素值以及遇到相同像素值的连续个数。当遇到不同像素值时,将上一个像素值及其个数作为一对数据输出。在处理二值图像时,只需考虑两种可能的像素值,...

    Java 安全编码.pdf

    Java 安全编码 Java 安全编码是 Java 开发语言中的一项重要考虑因素。Java 安全编码的主要目标是保护 Web 应用程序免受各种攻击和漏洞的影响。下面是 Java 安全编码的详细知识点: 1. SQL 注入攻击 SQL 注入攻击...

    Java编码规范.doc

    这份文档,"Java编码规范.doc",由东软集团有限公司的商用软件事业部编写,包含了国内大型Java项目和国际知名公司遵循的编码规范,以及编码过程中的注意事项和可能引发的问题。以下是对这份规范的一些关键点的详细...

    阿里巴巴 Java 编码指南,Alibaba Java Coding Guidelines​,兼容 Idea 2023.3+

    《阿里巴巴 Java 编码指南》是业界广泛采用的编码规范,旨在提高代码质量和开发效率,尤其对于使用 IntelliJ IDEA 的开发者来说,此指南的兼容性更新至 2023.3+ 版本,确保了最新的开发环境支持。这份指南在 2024 年...

    解决了DBF数据和表头乱码的javadbf.jar

    原始的javadbf.jar可能存在读取DBF文件时编码转换不准确的问题,导致中文或者其他非ASCII字符显示为乱码。开发者通过识别并修复了这个问题,使得新的javadbf.jar能够正确地处理包含非ASCII字符的数据和表头,提高了...

    java db 省市区编码表

    在Java DB中,省市区编码表是一个用于存储中国省级、市级和区县级行政区域编码的数据结构,常用于地理信息系统、地址管理或者与地理位置相关的应用程序。这个表通常包含四个字段:`id`、`areaid`、`area` 和 `...

    百度java编码规范

    除了以上所述,百度的Java编码规范可能还包括异常处理、错误处理、日志记录、资源管理等方面的要求,这些都是为了保证代码的健壮性和稳定性。遵循这些规范,可以使代码更加规范,提升代码质量,减少潜在的bug,同时...

    Java解决WE8DEC字符集乱码问题

    总结来说,解决Java中的WE8DEC字符集乱码问题涉及多个层面,从文件读写、数据库交互到Web请求和数据交换,都需要正确设置和处理字符编码。理解这些环节并应用适当的编码策略,是确保程序正确处理各种字符集的关键。

    java检测编码工具类

    Java编码检测工具类是Java开发中非常实用的一个组件,它能够帮助开发者准确地识别和处理各种文件的编码格式。在处理跨平台或者不同系统间的数据交换时,编码问题常常成为困扰,因为不同的操作系统和程序可能使用不同...

    公司java编码规范

    【公司Java编码规范】是确保团队协作和代码质量的重要文档,它定义了开发人员在编写Java代码时应遵循的一系列规则和最佳实践。这些规范旨在提高代码可读性、可维护性和可扩展性,减少错误,并使代码更容易理解和调试...

    Java出圈问题编码(记录出圈人的先后顺序)

    Java出圈问题编码,500人,每隔两人就出圈,记录每个人出圈的顺序。

    JAVA编码规范.doc

    JAVA 编码规范是指导开发人员编写高质量、可读性...综上所述,JAVA编码规范是开发过程中不可或缺的一部分,它涵盖了从文件结构到代码细节的方方面面,旨在提升代码质量,确保团队合作的顺畅,同时降低长期维护的成本。

Global site tag (gtag.js) - Google Analytics