java GBK字符转换成为UTF-8编码字符

import java.util.HashMap;
import java.util.Map;
/**
 * 创建日期: 2014-04-18 10:36:25
 * 作者: 黄飞
 * mail:huangfei8087@163.com 834865081@qq.com
 * ©版权归作者全部
 * */
public class ConverFromGBKToUTF8 {
	public static void main(String[] args) {
		try {
			ConverFromGBKToUTF8 convert = new ConverFromGBKToUTF8();
			String fullStr = convert.gbk2utf8("半角变拳脚,quanjiao "); 
			
			System.out.println( fullStr  ) ;
		} catch (Exception e) {
			e.printStackTrace(); 
		}
	}
	
	private StringUtil chinese(String chinese){
		StringUtil util = new StringUtil();
		char[]chars = chinese.toCharArray() ;
		int index = 0 ;
		StringBuffer buffer = new StringBuffer();
		for(char c : chars){
			String temp = String.valueOf(c) ;
			if(temp.getBytes().length == 1){
				util.map.put( index , temp ) ;
			}else{
				buffer.append( temp );
			}
			index++;
		}
		util.chinese = buffer.toString() ;
		return util ;
	}
	
	public String gbk2utf8(String chenese) {
		StringUtil strUtil = chinese( chenese ) ;
		char c[] = strUtil.chinese.toCharArray( ) ;
		byte[] fullByte = new byte[3 * c.length];
		for (int i = 0; i < c.length; i++) {
			int m = (int) c[i];
			String word = Integer.toBinaryString(m);

			StringBuffer sb = new StringBuffer();
			int len = 16 - word.length();
			for (int j = 0; j < len; j++) {
				sb.append("0");
			}
			sb.append(word);
			sb.insert(0, "1110");
			sb.insert(8, "10");
			sb.insert(16, "10");

			String s1 = sb.substring(0, 8);
			String s2 = sb.substring(8, 16);
			String s3 = sb.substring(16);

			byte b0 = Integer.valueOf(s1, 2).byteValue();
			byte b1 = Integer.valueOf(s2, 2).byteValue();
			byte b2 = Integer.valueOf(s3, 2).byteValue();
			byte[] bf = new byte[3];
			bf[0] = b0;
			fullByte[i * 3] = bf[0];
			bf[1] = b1;
			fullByte[i * 3 + 1] = bf[1];
			bf[2] = b2;
			fullByte[i * 3 + 2] = bf[2];
		}
		String reutrnStr = null ;
		try {
			reutrnStr = new String(fullByte, "UTF-8");
		} catch (Exception e) {
		} 
		StringBuffer returnBuffer = new StringBuffer(  reutrnStr );
		for(Map.Entry<Integer, String> entry : strUtil.map.entrySet()){
			returnBuffer.insert(entry.getKey() , entry.getValue() ) ;
		}
		
		return returnBuffer.toString() ;
	}
}

class StringUtil{
	public String chinese ; 

	public Map<Integer , String> map = new HashMap<Integer, String>();
}

posted @   phlsheji  阅读(13731)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2015-03-28 【Web优化】Yslow优化法则(四)启用Gzip压缩
2015-03-28 中石化牵手腾讯 背后隐藏了啥秘密?
2015-03-28 hdu 1420(Prepared for New Acmer)(中国剩余定理)(降幂法)
2015-03-28 vi 命令 使用方法
2015-03-28 STL vector使用方法介绍
2015-03-28 关于 Head First SQL 中文版
2015-03-28 XSS攻击及防御
点击右上角即可分享
微信分享提示