`
jinxhj2003
  • 浏览: 148354 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

java编码

    博客分类:
  • java
阅读更多
Unicode字 符在某个平台上不存在,将会输出一个'?'。
GB2312编码中一个汉字是16位的,而UTF8中一个汉字却是24位的。
如果发出页面采用了UTF-8的编码,怎样实现转换到gb2312?

private String utf8Togb2312(String str){
      StringBuffer sb = new StringBuffer();
      for(int i=0; i<str.length(); i++) {
          char c = str.charAt(i);
          switch (c) {
             case '+':
                 sb.append(' ');
             break;
             case '%':
                 try {
                      sb.append((char)Integer.parseInt(
                      str.substring(i+1,i+3),16));
                 }
                 catch (NumberFormatException e) {
                     throw new IllegalArgumentException();
                }
                i += 2;
                break;
             default:
                sb.append(c);
                break;
           }
      }
      // Undo conversion to external encoding
      String result = sb.toString();
      String res=null;
      try{
          byte[] inputBytes = result.getBytes("8859_1");
          res= new String(inputBytes,"UTF-8");
      }
      catch(Exception e){}
      return res;
}


UTF8转换成GB2312 当我们在基于HTTP协议的JSP或Servlet的应用中获取数据或发送请求时,JVM会把输送的数据编码成UTF8格式。如果我们直接从HTTP流中 提取中文数据,提取的结果为“????”(可能更多问号),为转换成我们能够理解的中文字符,我们需要把UTF8转换成GB2312,借助ISO- 8859-1标准编码能够轻易的实现,下面的代码实现了这一功能:

byte [] b;
String utf8_value;
utf8_value = request.getParameter("NAME");//从HTTP流中取"NAME"的UTF8数据
b = utf8_value.getBytes("8859_1"); //中间用ISO-8859-1过渡
String name = new String(b, "GB2312"); //转换成GB2312字符

这是我做的一个项目程序的一段:
      byte[] b;
      String gbk_value;
      gbk_value=request.getParameter("address");//从HTTP流中取"name"的GBK数据(由于web.xml中过滤器设置默认编码为GBK,所以外网从UTF-8变为GBK)
      b=gbk_value.getBytes("GBK");//中间用GBK过渡,从GBK转换成GBK数组
      String address=new String(b,"utf-8");//转换成utf-8字符
      myform.setAddress(address);

在知道流长度的情况下将输入流转换成字节数组 Java中的输入流抽象类InputStream有int read(byte[] b, int off, int len)方法,参数中byte[] b是用来存放从InputStream中读取的数据,int off指定数组b的偏移地址,也就是数组b的起始下标,int len指定需要读取的长度,方法返回实际读取的字节数。

刚学Java 的朋友可能要说:先定义一个与流长度等长的字节数组,调用read方法,指定起始下标为0,指定读取长度与数组长度等长,不是一下子可以读出来了吗?说的 没错,笔者曾经也试着这样读取数据,但后来发现在读取网络数据时很不安全,我们想想在网络上获取数据可能并没那么流畅,数据流的传送可能会断断续续,所以 并不能保证一次就能读取全部数据,特别是在读取大容量数据时更是如此,所以我们必须在读取数据时检测实际读到的长度,如果没有读完已知长度的数据就应该再 次读取,以此循环检测,直到实际读取的长度累加与已知的长度相等,下面的代码实现了这一功能:

UTF8到GBK的相互转换          
<%
              String str="你好莱坞";
              out.print(enCode(str));
              out.print("<br/>"+deCode(enCode(str)));
           %>

<%!
String enCode(String str)                                   
      {                                                       
        if(str==null)return "";                               
        String hs="";                                         
                                                            
        try                                                   
        {                                                     
          byte b[]=str.getBytes("UTF-16");                    
          //System.out.println(byte2hex(b));                  
          for (int n=0;n<b.length;n++)                        
          {                                                   
              str=(java.lang.Integer.toHexString(b[n] & 0XFF));
              if (str.length()==1)                            
                hs=hs+"0"+str;                                
              else                                            
                hs=hs+str;                                    
              if (n!=b.length-1)hs=hs+"";                     
          }                                                   
                                                              
          str= hs.toUpperCase().substring(4);                 
          //System.out.println(str);                          
          char[] chs=str.toCharArray();                       
          str="";                                             
          for(int i=0;i<chs.length;i=i+4)                     
          {                                                   
            str+="&#x"+chs[i]+chs[i+1]+chs[i+2]+chs[i+3]+";"; 
          }                                                   
                                                              
        }                                                     
        catch(Exception e)                                    
        {                                                     
          System.out.print(e.getMessage());                   
        }                                                     
        return str;                                           
      }            


String deCode(String str)                                                
    {                                                                                                          
        if (str == null)                                               
        {                                                              
            return "";                                                   
        }                                                              
        String temp = "";                                              
        String return_temp = "";                                       
        try                                                            
        {                                                              
            int str_len = str.length() / 7;                              
            for (int i = 1; i <= str_len; i++)                           
            {                                                            
                temp += str.substring(3 * i + 5 * (i - 1), 7 * i + (i - 1));
            }                                                            
            temp = "FEFF" + temp;                                        
            temp = temp.toLowerCase();                                   
            int temp_len = temp.length() / 2;                            
            byte mm[] = new byte[temp_len];                              
            String ss[] = new String[temp_len];                          
            for (int i = 0; i < temp_len; i++)                           
            {                                                            
                String qq = temp.substring(i * 2, i * 2 + 1);              
                if (!qq.equals("0"))                                       
                {                                                          
                    ss[i] = temp.substring(i * 2, i * 2 + 2);                
                }                                                          
                else                                                       
                {                                                          
                    ss[i] = temp.substring(i * 2 + 1, i * 2 + 2);            
                }                                                          
                mm[i] = (byte) Integer.parseInt(ss[i], 16);                
                System.out.println(mm[i]);                                 
            }                                                            
            return_temp = new String(mm, "UTF-16");                      
        }                                                              
        catch (Exception e)                                            
        {                                                              
            System.out.print(e.getMessage());                            
        }                                                              
        return return_temp;                                            
    }                                       
   


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yown/archive/2007/05/15/1610010.aspx
分享到:
评论

相关推荐

    阿里巴巴java编码规范

    阿里巴巴java编码规范 ,Java 并发编程培训(阿里巴巴) 《阿里巴巴Java开发手册》,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大...

    华为JAVA编码规范.pdf

    华为JAVA编码规范.pdf 华为JAVA编码规范.pdf是华为公司编写的JAVA编程语言编码规范,旨在提供一个统一的编程风格和代码组织方式,以提高代码的可读性、维护性和可重用性。该规范涵盖了编程语言的基本结构、命名规则...

    腾讯java编码规范

    腾讯 Java 编码规范 腾讯 Java 编码规范是腾讯集团管理标准的一部分,旨在确保公司项目代码的易维护性和编码安全性。该规范涵盖了 Java 编码风格、文件组织、代码风格、注释、命名、声明、异常、习惯等方面。 一、...

    Java编码规范.docx

    Java 编码规范 Java 编码规范是指在 Java 语言中编写代码时需要遵守的一些约定和规则,以确保代码的可读性、可维护性和可扩展性。本文将对 Java 编码规范的主要内容进行详细讲解。 命名风格是 Java 编码规范的重要...

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

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

    Java编码规范.doc

    Java编码规范是软件开发中非常重要的一个环节,它旨在提高代码质量、可读性、可维护性和团队协作效率。这份文档,"Java编码规范.doc",由东软集团有限公司的商用软件事业部编写,包含了国内大型Java项目和国际知名...

    JAVA编码规范试题

    JAVA编码规范是软件开发中不可或缺的一部分,它不仅有助于提高代码的可读性和可维护性,还能促进团队协作,减少潜在的编程错误。以下是从给定的文件信息中提炼出的关键知识点,涵盖了JAVA编码规范的基本原则、文件...

    Java 编码标准(PDF)

    Java编码标准是软件开发中的一项重要规范,它旨在提高代码质量、可读性以及团队间的协作效率。这份PDF文档很可能是Oracle公司或者一些知名的Java社区制定的编程规范,旨在为Java开发者提供一套统一的编码指南。以下...

    java编码总结1

    【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...

    百度java编码规范

    **百度Java编码规范** 在软件开发中,遵循一定的编码规范是非常重要的,它能提高代码的可读性,便于团队协作,降低维护成本。百度作为一家技术驱动的公司,也提出了其内部使用的Java编码规范,旨在确保代码的一致性...

    js解码 、java编码

    本文将深入探讨“js解码”和“java编码”这两个主题,并结合标签“源码”和“工具”,讨论如何在实际项目中应用它们。 首先,我们来看JavaScript中的解码。JavaScript是一种在客户端和服务器端都能运行的脚本语言,...

    公司使用的java编码规范

    Java 编码规范是开发团队遵循的一套标准,旨在提高代码质量、可读性和可维护性。这份规范涵盖了多个方面,包括文件命名、命名规范、Java 文件样式、代码编写格式以及编程技巧和性能优化等。 1. **前言** - 简介:...

    Neusoft公司Java编码规范.rar

    Java编码规范(Java Coding Standard) oiNSFT-BS-OT0105 V3.0 2005-5-11 东软集团有限公司 商用软件事业部 版权所有 中国 沈阳浑南高新技术产业开发区 东软软件园

    JAVA编码规范培训

    JAVA编码规范培训

    java编码规范(华为)

    "java编码规范(华为)" Java编码规范是华为公司为Java语言编程提供的规范性文档,旨在提高编程的规范化和专业化。本规范涵盖了Java语言编程的各个方面,包括排版、注释、命名、编码和JTEST规则和建议。 1. 范围 ...

Global site tag (gtag.js) - Google Analytics