java 字符 UTF8 GBK unicode 16进制 hex 互转 转换

先要明白在java或者其他语言中,字符是以字节的形式存在的,UTF8 GBK unicode 是不同的编码格式。
在各种编码总英文26个字母,基本都是占1个字节,比如a 是67;而对于汉子就不这么友好,在gbk中基本上是2个字节,在utf8中是3个,在unicode中就是4个了,具体的在这里不再详述,这里只讲基本的转换原理。
同一个字 比如“我”,在不同的编码中字节码如下:
GBK -50 -46
UTF8 -26 -120 -111
Unicode -2 -1 98 17
而转换成16进制是按字节转换的,1个字节是8个bite也就是8位,2^8=256 字节取值-127~126 正好256个,在转16进制的时候是要要进行无符号转换的,这样就是 00 到 ff 正好也是256个 这样只要用2个字符就可以代表一个字节的信息。所以不同编码格式的相同字符传转换成16进制串是不一样的。还是以“我”为例,转换后分别是
GBK CED2
UTF8 E68891
Unicode FEFF6211
因此要解码16进制,就需要知道具体的原编码格式否则是不能解码的,除非你愿意每种编码都试一遍。
流程都是 字符串<=>字节<=>16进制,需要注意的是16进制是按照2位一组进行解码的。下面的类实现了各种编码通过字节向16进制的互转,希望对大家有所帮助。
还有在java中 编码的转换可以通过
new String(str.getBytes(),chartype);
这中方式直接转换,不用特别复杂,原理大概就是先转成原编码的字节码,然后内置的再转成指定的编码



public class SBH {
/**
* @Title:bytes2HexString
* @Description:字节数组转16进制字符串
* @param b
* 字节数组
* @return 16进制字符串
* @throws
*/
public static String bytes2HexString(byte[] b) {
StringBuffer result = new StringBuffer();
for (int i = 0; i < b.length; i++) {
result.append(String.format("%02X",b[i]));
}
return result.toString();
}

/**
* @Title:hexString2Bytes
* @Description:16进制字符串转字节数组
* @param src
* 16进制字符串
* @return 字节数组
* @throws
*/
public static byte[] hexString2Bytes(String src) {
int l = src.length() / 2;
byte[] ret = new byte[l];
for (int i = 0; i < l; i++) {
ret[i] = Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
}
return ret;
}

/**
* @Title:string2HexUTF8
* @Description:字符UTF8串转16进制字符串
* @param strPart
* 字符串
* @return 16进制字符串
* @throws
*/
public static String string2HexUTF8(String strPart) {

return string2HexString(strPart,"UTF-8");
}

/**
* @Title:string2HexUnicode
* @Description:字符Unicode串转16进制字符串
* @param strPart
* 字符串
* @return 16进制字符串
* @throws
*/
public static String string2HexUnicode(String strPart) {

return string2HexString(strPart,"Unicode");
}
/**
* @Title:string2HexGBK
* @Description:字符GBK串转16进制字符串
* @param strPart
* 字符串
* @return 16进制字符串
* @throws
*/
public static String string2HexGBK(String strPart) {

return string2HexString(strPart,"GBK");
}
/**
* @Title:string2HexString
* @Description:字符串转16进制字符串
* @param strPart 字符串
* @param tochartype hex目标编码
* @return 16进制字符串
* @throws
*/
public static String string2HexString(String strPart,String tochartype) {
try{
return bytes2HexString(strPart.getBytes(tochartype));
}catch (Exception e){
return "";
}
}

/**
* @Title:hexUTF82String
* @Description:16进制UTF-8字符串转字符串
* @param src
* 16进制字符串
* @return 字节数组
* @throws
*/
public static String hexUTF82String(String src) {

return hexString2String(src,"UTF-8","UTF-8");
}

/**
* @Title:hexGBK2String
* @Description:16进制GBK字符串转字符串
* @param src
* 16进制字符串
* @return 字节数组
* @throws
*/
public static String hexGBK2String(String src) {

return hexString2String(src,"GBK","UTF-8");
}

/**
* @Title:hexUnicode2String
* @Description:16进制Unicode字符串转字符串
* @param src
* 16进制字符串
* @return 字节数组
* @throws
*/
public static String hexUnicode2String(String src) {
return hexString2String(src,"Unicode","UTF-8");
}

/**
* @Title:hexString2String
* @Description:16进制字符串转字符串
* @param src
* 16进制字符串
* @return 字节数组
* @throws
*/
public static String hexString2String(String src,String oldchartype, String chartype) {
byte[] bts=hexString2Bytes(src);
try{if(oldchartype.equals(chartype))
return new String(bts,oldchartype);
else
return new String(new String(bts,oldchartype).getBytes(),chartype);
}
catch (Exception e){

return"";
}
}


}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值