UTF和GBK互转

Wesley13
• 阅读 759

不说了直接上代码:

package com.yh.photo.util;

public class UTF2GBK {
 public static String gbk2utf8(String gbk) {
  String l_temp = GBK2Unicode(gbk);
  l_temp = unicodeToUtf8(l_temp);
  return l_temp;
 }
 public String utf82gbk(String utf) {
  String l_temp = utf8ToUnicode(utf);
  l_temp = Unicode2GBK(l_temp);
  return l_temp;
 }
 /**
  * 
  * @param str
  * @return String
  */
 public static String GBK2Unicode(String str) {
  StringBuffer result = new StringBuffer();
  for (int i = 0; i < str.length(); i++) {
   char chr1 = (char) str.charAt(i);
   if (!isNeedConvert(chr1)) {
    result.append(chr1);
    continue;
   }
   result.append("\\u" + Integer.toHexString((int) chr1));
  }
  return result.toString();
 }
 /**
  * 
  * @param dataStr
  * @return String
  */
 public static String Unicode2GBK(String dataStr) {
  int index = 0;
  StringBuffer buffer = new StringBuffer();
  int li_len = dataStr.length();
  while (index < li_len) {
   if (index >= li_len - 1 || !"\\u".equals(dataStr.substring(index, index + 2))) {
    buffer.append(dataStr.charAt(index));
    index++;
    continue;
   }
   String charStr = "";
   charStr = dataStr.substring(index + 2, index + 6);
   char letter = (char) Integer.parseInt(charStr, 16);
   buffer.append(letter);
   index += 6;
  }
  return buffer.toString();
 }
 public static boolean isNeedConvert(char para) {
  return ((para & (0x00FF)) != para);
 }
 /**
  * utf-8 转unicode
  * 
  * @param inStr
  * @return String
  */
 public static String utf8ToUnicode(String inStr) {
  char[] myBuffer = inStr.toCharArray();
  StringBuffer sb = new StringBuffer();
  for (int i = 0; i < inStr.length(); i++) {
   Character.UnicodeBlock ub = Character.UnicodeBlock.of(myBuffer[i]);
   if (ub == Character.UnicodeBlock.BASIC_LATIN) {
    sb.append(myBuffer[i]);
   } else if (ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
    int j = (int) myBuffer[i] - 65248;
    sb.append((char) j);
   } else {
    short s = (short) myBuffer[i];
    String hexS = Integer.toHexString(s);
    String unicode = "\\u" + hexS;
    sb.append(unicode.toLowerCase());
   }
  }
  return sb.toString();
 }
 /**
  * 
  * @param theString
  * @return String
  */
 public static String unicodeToUtf8(String theString) {
  char aChar;
  int len = theString.length();
  StringBuffer outBuffer = new StringBuffer(len);
  for (int x = 0; x < len;) {
   aChar = theString.charAt(x++);
   if (aChar == '\\') {
    aChar = theString.charAt(x++);
    if (aChar == 'u') {
     // Read the xxxx
     int value = 0;
     for (int i = 0; i < 4; i++) {
      aChar = theString.charAt(x++);
      switch (aChar) {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
       value = (value << 4) + aChar - '0';
       break;
      case 'a':
      case 'b':
      case 'c':
      case 'd':
      case 'e':
      case 'f':
       value = (value << 4) + 10 + aChar - 'a';
       break;
      case 'A':
      case 'B':
      case 'C':
      case 'D':
      case 'E':
      case 'F':
       value = (value << 4) + 10 + aChar - 'A';
       break;
      default:
       throw new IllegalArgumentException("Malformed   \\uxxxx   encoding.");
      }
     }
     outBuffer.append((char) value);
    } else {
     if (aChar == 't')
      aChar = '\t';
     else if (aChar == 'r')
      aChar = '\r';
     else if (aChar == 'n')
      aChar = '\n';
     else if (aChar == 'f')
      aChar = '\f';
     outBuffer.append(aChar);
    }
   } else
    outBuffer.append(aChar);
  }
  return outBuffer.toString();
 }
}

// 该代码片段来自于: http://www.sharejs.com/codes/java/5422

测试情况见:  http://www.oschina.net/question/219762_212483

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这