【最近面试遇到的一些问题】JAVA UTF-8 GB2312 编码互转

朋友让我帮他写个gb2312->utf-8的字符转换程序,找了半天没有在网上找到合适的,于是自己动手写了一个,呵呵。把它贴在这里,免得以后忘记了 ^_^

    实现思路大致如下:

  •  取得一个汉字的Unicode码
  • 把Unicode码分解为两个16进制数据字符串(丢弃前两个字节)
  • 把这两个16进制数据字符串转换成二进制数据字符串
  • 把二进制数据字符串分解为三个串,第一个串为4(0~4)个位,在高位加上标记位“1110”,第二(4~10)、三个(10~16)串均为6个位,分别在高位加上“10”标记位
  • 把这三个二进制串分别转换为10进制数据并赋值给字节型数组
  • 根据这个字节型数组构造UTF-8字符

java 代码

 

  1. import java.io.File;   
  2. import java.io.FileOutputStream;   
  3. import java.io.UnsupportedEncodingException;   
  4.   
  5. /**  
  6.  * 2007-8-10 jyin at gomez dot com  
  7.  */  
  8. public class CharsetConvertor {   
  9.     public static void main(String[] args) {
      
  10.         String str = "This is a test for *中网!@#$。,?";   
  11.         try {   
  12.             File f = new File("D:/test.txt");
      
  13.             FileOutputStream fio = new FileOutputStream(f);   
  14.             String s = gbToUtf8(str);   
  15.             fio.write(s.getBytes("UTF-8"));   
  16.             fio.close();   
  17.         }   
  18.         catch (Exception e) {   
  19.             e.printStackTrace();   
  20.         }   
  21.     }   
  22.   
  23.     public static String gbToUtf8(String str) throws UnsupportedEncodingException {
      
  24.         StringBuffer sb = new StringBuffer();   
  25.         for (int i = 0; i < str.length(); i++) {
      
  26.             String s = str.substring(i, i + 1);   
  27.             if (s.charAt(0) > 0x80) {
      
  28.                 byte[] bytes = s.getBytes("Unicode");
      
  29.                 String binaryStr = "";   
  30.                 for (int j = 2; j < bytes.length; j += 2) {
      
  31.                     // the first byte   
  32.                     String hexStr = getHexString(bytes[j + 1]);   
  33.                     String binStr = getBinaryString(Integer.valueOf(hexStr, 16));   
  34.                     binaryStr += binStr;   
  35.                     // the second byte   
  36.                     hexStr = getHexString(bytes[j]);   
  37.                     binStr = getBinaryString(Integer.valueOf(hexStr, 16));   
  38.                     binaryStr += binStr;   
  39.                 }   
  40.                 // convert unicode to utf-8   
  41.                 String s1 = "1110" + binaryStr.substring(0, 4);
      
  42.                 String s2 = "10" + binaryStr.substring(4, 10);
      
  43.                 String s3 = "10" + binaryStr.substring(10, 16);
      
  44.                 byte[] bs = new byte[3];
      
  45.                 bs[0] = Integer.valueOf(s1, 2).byteValue();   
  46.                 bs[1] = Integer.valueOf(s2, 2).byteValue();   
  47.                 bs[2] = Integer.valueOf(s3, 2).byteValue();   
  48.                 String ss = new String(bs, "UTF-8");
      
  49.                 sb.append(ss);   
  50.             } else {   
  51.                 sb.append(s);   
  52.             }   
  53.         }   
  54.         return sb.toString();   
  55.     }   
  56.   
  57.     private static String getHexString(byte b) {
      
  58.         String hexStr = Integer.toHexString(b);   
  59.         int m = hexStr.length();   
  60.         if (m < 2) {   
  61.             hexStr = "0" + hexStr;   
  62.         } else {   
  63.             hexStr = hexStr.substring(m - 2);   
  64.         }   
  65.         return hexStr;   
  66.     }   
  67.   
  68.     private static String getBinaryString(int i) {
      
  69.         String binaryStr = Integer.toBinaryString(i);   
  70.         int length = binaryStr.length();   
  71.         for (int l = 0; l < 8 - length; l++) {
      
  72.             binaryStr = "0" + binaryStr;   
  73.         }   
  74.         return binaryStr;   
  75.     }   
  76. }  

另外:

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class UnicodeChange {

	//UTF-8->GB2312
	public static 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 ; 

             } 

        } 

        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; 

  }

	//GB2312->UTF-8
	public static String gb2312ToUtf8(String str) { 

        String urlEncode = "" ; 

        try { 

            urlEncode = URLEncoder.encode (str, "UTF-8" ); 

        } catch (UnsupportedEncodingException e) { 

            e.printStackTrace(); 

        } 

        return urlEncode; 

    }

	public static void main(String[] args){   

	    	try {

	    	String str="輸入簡體字,點下面繁體字按鈕進行在線轉換.";//%E4%B8%AD%E5%9B%BD

	    	str=gb2312ToUtf8(str);

			System.out.println(str);

			str=utf8Togb2312(str);

			System.out.println(str);

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

	    }   

}
时间: 2024-11-02 04:49:12

【最近面试遇到的一些问题】JAVA UTF-8 GB2312 编码互转的相关文章

JAVA及相关字符集编码问题研究分享_java

下面本文将针对以上几点问题进行描述讨论,我们就以"中文"两个字为例来说明,查找相关资料可知"中文"的GB2312编码是"d6d0 cec4",为Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".(注意,"中文"这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示"). 一.编码基本知识: 最早的编码是iso

Java中的字符集编码入门(四) 网页文件的编码

接着上节的思路说,一个网页要想在浏览器中能够正确显示,需要在三个地方保持编码的一致:网页文件,网页编码声明和浏览器编码设置. 首先是网页文件本身的编码,即网页文件在被创建的时候使用什么编码来保存.这个完全取决于创建该网页的人员使用了什么编码保存,而进一步的取决于该人员使用的操作系统.例如我们使用的中文版WindowsXP系统,当你新建一个文本文件,写入一些内容,并按下ctrl+s进行保存的那一刻,操作系统就替你使用GBK编码将文件进行了保存(没有使用UTF-8,也没有使用UTF-16).而使用了

Java中的字符编码问题处理心得总结_java

当面对一串字节流的时候,如果不指定它的编码,其实际意义是无法知道的. 这句话应该也是我们面对"字符转字节,字节转字符"问题时候时刻记在脑子里的.否则乱码问题可能就接踵而至. 其实乱码问题的本质就是Encoding和Decoding用的不是一个编码,明白了这个道理就很好解决乱码问题了. Java中常见的时候有如下: 1. String类使用byte[]的构造函数 String(byte[] bytes),String类同时提供了两个重载 (1)String(byte[] bytes, C

Java实现的URL编码和解码技术

当编写 " 网络爬虫" 或下载器时,在 Java 中实现 URL 编码和解码是一个很常见的要求.本文的重点是创建用于对所传递的 URL 进行编码和解码的模块. Main 方法 public static void main(String[] args) {                // TODO Auto-generated method stub                String url="https%3A%2F%2Fr1---sn-ci5gup-cags.

java实现在不同编码之间进行文件转换程序

java实现在不同编码之间进行文件转换,使用 InputStreamReader 或者FileReader 类,它们可以自动地把某个特定字符编码转换为本地字符代码.否则就使用DataOutputStream 类当中的writeUTF()方法以Unicode 文本写字符串,当然,读取的时候必须使用DataInputStream 打开它,并且使用readUTF()方法读取这些字符串. 为什么要转换编码呢?大家都知道,Java 语言是以Unicode 为基础的,但是操作系统都有它们自己内部的可能是与U

阿里面试回来,想和Java程序员谈一谈

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论"面试前该不该刷题"这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习

Java中的字符集编码入门(六) Java中的增补字符

Java号称对Unicode提供天然的支持,这话在很久很久以前就已经是假的了(不过曾经是真的),实际上,到JDK5.0为止,Java才算刚刚跟上Unicode的脚步,开始提供对增补字符的支持. 现在的Unicode码空间为U+0000到U+10FFFF,一共1114112个码位,其中只有1,112,064 个码位是合法的(我来替你做算术,有2048个码位不合法),但并不是说现在的Unicode就有这么多个字符了,实际上其中很多码位还是空闲的,到Unicode 4.0 规范为止,只有96,382个

Java中的字符集编码入门(五) Java代码中的字符编码转换

如果你是JVM的设计者,让你来决定JVM中所有字符的表示形式,你会不会允许使用各种编码方式的字符并存? 我想你的答案是不会,如果在内存中的Java字符可以以GB2312,UTF-16,BIG5等各种编码形式存在,那么对开发者来说,连进行最基本的字符串打印.连接等操作都会寸步难行.例如一个GB2312的字符串后面连接一个UTF-8的字符串,那么连接后的最终结果应该是什么编码的呢?你选哪一个都没有道理. 因此牢记下面这句话,这也是Java开发者的共同意志:在Java中,字符只以一种编码形式存在,那就

Java中的字符集编码入门(三) GB2312,GBK与中文网页

GB2312是对中国的开发人员来说很重要的一个词汇,它的来龙去脉并不需要我在这里赘述,随便Goolge之便明白无误.我只是想提一句,记得前一节说到编码字符集和字符集编码不是一回事,而有的字符集编码又实际上没有做任何事,GB2312正是这样一种东西! GB2312最初指的是一个编码字符集,其中包含了ASCII所包含的英文字符,同时加入了6763个简体汉字以及其他一些ASCII之外的符号.与Unicode有UTF-8和UTF-16一样(当然, UTF-8和UTF-16也没有被限定只能用来对Unico