字符编码处理工具类

1 篇文章 0 订阅
package com.e.util;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 编码处理类
 *
 * @author sky
 */
public class Charset
{

    private static String HEX = "0123456789ABCDEF";

    private static byte[] _HexToBytes(String hex)
    {
        String _hex = hex.toUpperCase();
        byte[] result = new byte[hex.length() / 2];
        for (int i = 0; i < _hex.length() / 2; i++)
        {
            byte HH = (byte) (HEX.indexOf(_hex.substring(2 * i, 2 * i + 1)) << 4);
            byte HL = (byte) (HEX.indexOf(_hex.substring(2 * i + 1, 2 * i + 2)));
            result[i] = (byte) (HH | HL);
        }
        return result;
    }

    public static String toHex(byte one)
    {
        String HEX = "0123456789ABCDEF";
        byte[] bTmp = new byte[2];
        bTmp[0] = (byte) (HEX.charAt((one & 0xf0) >> 4));
        bTmp[1] = (byte) (HEX.charAt(one & 0x0f));
        String result = new String(bTmp);
        return result;
    }

    /**
     * 将字符串转为十六进制,BLOB/CLOB时常用
     * 
     * @param value
     *            字符串
     * @return 16进制字符串
     */
    public static String StrToHex(String value)
    {
        if (value == null)
        {
            return "";
        }
        String str = "";
        byte[] btmp = value.getBytes();
        for (int i = 0; i < btmp.length; i++)
        {
            str = str + toHex(btmp[i]);
        }
        return str;
    }

    /**
     * 将十六进制改为字符串
     * 
     * @param hex
     *            16进制字符串
     * @return 字符串
     */
    public static String HexToStr(String hex)
    {
        if (hex == null)
        {
            return "";
        }
        byte temp[] = _HexToBytes(hex);
        String result = new String(temp);
        return result;
    }

    /**
     * 将十六进制字符串改为字节数组
     * 
     * @param hex
     *            16进制字符串
     * @return 字节数组
     */
    public static byte[] hexToBytes(String hex)
    {
        byte temp[] = _HexToBytes(hex);
        return temp;
    }

    /**
     * 将字节数组改为16进制字符串
     * 
     * @param bytes
     *            字节数组
     * @return 16进制字符串
     */
    public static String bytesToHex(byte[] bytes)
    {
        String ret = "";
        for (int i = 0; i < bytes.length; i++)
        {
            ret += toHex(bytes[i]);
        }
        return ret;
    }

    /**
     * 将字符串编码改为Unicode
     * 
     * @param value
     *            字符串
     * @return 字符串
     */
    public static String toUnicode(String value)
    {
        if (value == null)
        {
            return "";
        }
        byte[] tmp = new byte[value.length()];
        int I = 0;
        while (I < value.length())
        {
            tmp[I] = (byte) (value.charAt(I) & 0x00FF);// 双字节
            I++;
        }
        String result = new String(tmp);
        return result;
    }

    /**
     * 把字符串的编码从GB2312转换为ISO8859_1.
     * 
     * @param str
     *            输入字符串.
     * @return 编码后的字符串.
     */
    public static String GB_2_ISO8859(String str)
    {
        if (str == null)
        {
            return "";
        }
        try
        {
            str = new String(str.getBytes("GBK"), "iso-8859-1");
            return str;
        } catch (Exception ex)
        {
        }
        return null;
    }

    /**
     * 把字符串的编码从ISO8859_1转换为GB2312.
     * 
     * @param str
     *            输入字符串.
     * @return 编码后的字符串.
     */
    public static String ISO8859_2_Gb(String str)
    {
        if (str == null)
        {
            return "";
        }
        try
        {
            str = new String(str.getBytes("iso-8859-1"), "GBK");
            return str;
        } catch (Exception ex)
        {
        }
        return null;
    }

    /*
     * 把ASCII码转换为中文字符串(String)
     */
    public static String ASCII2String(int[] ASCIIs) {  
        StringBuffer sb = new StringBuffer();  
        for (int i = 0; i < ASCIIs.length; i++) {  
            sb.append((char) ascii2Char(ASCIIs[i]));  
        }  
        return sb.toString();  
    } 

    public static String ASCII2String(String ASCIIs) { 
        String[] ASCIIss = ASCIIs.split(",");  
        StringBuffer sb = new StringBuffer();  
        for (int i = 0; i < ASCIIss.length; i++) {  
            sb.append((char) ascii2Char(Integer.parseInt(ASCIIss[i])));  
        }  
        return sb.toString();  
    }  

    /*
     * 把中文字符串(String)转换为ASCII码
     */
   public static int[] string2ASCII(String str)
   {  
        if (str == null || "".equals(str)) {  
            return null;  
        }  

        char[] chars = str.toCharArray();  
        int[] asciiArray = new int[chars.length];  

        for (int i = 0; i < chars.length; i++) {  
            asciiArray[i] = char2ASCII(chars[i]);  
        }  
        return asciiArray;  
    }  

   /**
    * 数字字符串转ASCII码字符串
    * 
    * @param String字符串
    * @return ASCII字符串
    */
   public static String StringToAsciiString(String content) {
       String result = "";
       int max = content.length();
       for (int i = 0; i < max; i++) {
           char c = content.charAt(i);
           String b = Integer.toHexString(c);
           result = result + b;
       }
       return result;
   }

   /**
    * ASCII码字符串转数字字符串
    * 
    * @param String ASCII字符串
    * @return 字符串
    */
   public static String AsciiStringToString(String content) {
       String result = "";
       int length = content.length() / 2;
       for (int i = 0; i < length; i++) {
           String c = content.substring(i * 2, i * 2 + 2);
           int a = hexStringToAlgorism(c);
           char b = (char) a;
           String d = String.valueOf(b);
           result += d;
       }
       return result;
   }

   /**
    * 十六进制字符串装十进制
    * 
    * @param hex  十六进制字符串
    * @return     十进制数值
    */
   public static int hexStringToAlgorism(String hex) {
       hex = hex.toUpperCase();
       int max = hex.length();
       int result = 0;
       for (int i = max; i > 0; i--) {
           char c = hex.charAt(i - 1);
           int algorism = 0;
           if (c >= '0' && c <= '9') {
               algorism = c - '0';
           } else {
               algorism = c - 55;
           }
           result += Math.pow(16, max - i) * algorism;
       }
       return result;
   }

   /*
    * 字符(char)转换为ASCII码
    */
   public static int char2ASCII(char c) {  
       return (int) c;  
   }

   /*
    * ASCII码转换为字符(char)
    */
   public static char ascii2Char(int ASCII) {  
       return (char) ASCII;  
   } 


   public static String hexToString(String hexString) throws NumberFormatException, UnsupportedEncodingException {

       if(hexString.length() % 2 != 0) {             
        throw new IllegalArgumentException("error");         
       }         

       char[] chars             = hexString.toCharArray();         
       byte[] b                 = new byte[chars.length / 2];         
       for(int i = 0, j = b.length; i < j; i++) {             
        int high            = Character.digit(chars[2 * i], 16) << 4;             
        int low             = Character.digit(chars[2 * i + 1], 16);             
        b[i]                = (byte)(high | low);         
       }         

       return new String(b); 

    }

    public static String stringToHex(String s) throws UnsupportedEncodingException {

        byte[] b            = s.getBytes();
        char[] hex          = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};         
        char[] newChar      = new char[b.length * 2];

        for(int i = 0, j = b.length; i < j; i++) {             
            newChar[2 * i]      = hex[(b[i] & 0xf0) >> 4];             
            newChar[2 * i + 1]  = hex[b[i] & 0xf];         
        } 

        return new String(newChar); 

    }

    /**
     * 将short类型转换为byte数组
    * @Title: shortToBytes
    * @Description: TODO
    * @param @param sNum
    * @param @return  
    * @return byte[]
    * @throws
     */
    public static byte[] shortToBytes(short sNum) {
        byte[] bytesRet = new byte[2];
        bytesRet[0] = (byte) ((sNum >> 8) & 0xFF);
        bytesRet[1] = (byte) (sNum & 0xFF);
        return bytesRet;
    }

    /**
     * 将byte数组转换为short类型
    * @Title: bytesToShort
    * @Description: TODO
    * @param @param bytesShort
    * @param @return  
    * @return short
    * @throws
     */
    public static short bytesToShort(byte[] bytesShort) {
        short sRet = 0;
        sRet += (bytesShort[0] & 0xFF) << 8;
        sRet += bytesShort[1] & 0xFF;
        return sRet;
    }


    /** 
     * @功能: 10进制串转为BCD码 
     * @参数: 10进制串  String
     * @结果: BCD码  byte[]
     * 
     * 
     */  
    public static byte[] decimal‎2Bcd(String decimal) {  
        int len = decimal.length();  
        int mod = len % 2;  
        if (mod != 0) {  
            decimal = "0" + decimal;  
            len = decimal.length();  
        }  
        byte abt[] = new byte[len];  
        if (len >= 2) {  
            len = len / 2;  
        }  
        byte bbt[] = new byte[len];  
        abt = decimal.getBytes();  
        int j, k;  
        for (int p = 0; p < decimal.length() / 2; p++) {  
            if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {  
                j = abt[2 * p] - '0';  
            } else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {  
                j = abt[2 * p] - 'a' + 0x0a;  
            } else {  
                j = abt[2 * p] - 'A' + 0x0a;  
            }  
            if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {  
                k = abt[2 * p + 1] - '0';  
            } else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {  
                k = abt[2 * p + 1] - 'a' + 0x0a;  
            } else {  
                k = abt[2 * p + 1] - 'A' + 0x0a;  
            }  
            int a = (j << 4) + k;  
            byte b = (byte) a;  
            bbt[p] = b;  
        }  
        return bbt;  
    }  

    /** 
     * @功能: BCD码转为10进制串(阿拉伯数据) 
     * @参数: BCD码 
     * @结果: 10进制串 
     * 
     * 例如:“11”---> 3131
     */  
    public static String bcd2Str(byte[] bytes) {  
        StringBuffer temp = new StringBuffer(bytes.length * 2);  
        for (int i = 0; i < bytes.length; i++) {  
            temp.append((byte) ((bytes[i] & 0xf0) >>> 4));  
            temp.append((byte) (bytes[i] & 0x0f));  
        }  
        return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp  
                .toString().substring(1) : temp.toString();  
    }  


     private static byte asc_to_bcd(byte asc) {
     byte bcd;

     if ((asc >= '0') && (asc <= '9'))
     bcd = (byte) (asc - '0');
     else if ((asc >= 'A') && (asc <= 'F'))
     bcd = (byte) (asc - 'A' + 10);
     else if ((asc >= 'a') && (asc <= 'f'))
     bcd = (byte) (asc - 'a' + 10);
     else
     bcd = (byte) (asc - 48);
     return bcd;
     }

     /**
      * ASCII--->BCD
      * @param ascii
      * @param asc_len
      * @return
      */
     private static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {
     byte[] bcd = new byte[asc_len / 2];
     int j = 0;
     for (int i = 0; i < (asc_len + 1) / 2; i++) {
     bcd[i] = asc_to_bcd(ascii[j++]);
     bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));
     System.out.format("%02X\n", bcd[i]);
     }
     return bcd;
     }

     /**
      * BCD码转为字符串
      * @param bytes
      * @return
      */
     public static String bcd2String(byte[] bytes) {
     char temp[] = new char[bytes.length * 2], val;

     for (int i = 0; i < bytes.length; i++) {
     val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);
     temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');

     val = (char) (bytes[i] & 0x0f);
     temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
     }
     return new String(temp);
     }




    /**
     * MD5摘要大写
     */

     public static String getMD5(String str) {

            // 生成一个MD5加密计算摘要
            MessageDigest md;
            try {
                md = MessageDigest.getInstance("MD5");

                 // 计算md5函数
                md.update(str.getBytes());

                // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
                // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值,并且转成大写
                return new BigInteger(1, md.digest()).toString(16).toUpperCase();

            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }

         return null;
    } 





}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java中字符编码转换的工具类可以通过使用Java自带的Charset类和String类的getBytes()方法来实现。下面是一个示例的工具类: ```java import java.nio.charset.Charset; public class EncodingUtils { // 将指定编码字符串转换为默认编码字符串 public static String convertToDefaultEncoding(String str, String sourceEncoding) { byte[] bytes = str.getBytes(Charset.forName(sourceEncoding)); return new String(bytes); } // 将默认编码字符串转换为指定编码字符串 public static String convertToEncoding(String str, String targetEncoding) { byte[] bytes = str.getBytes(); return new String(bytes, Charset.forName(targetEncoding)); } } ``` 使用示例: ```java public class Main { public static void main(String[] args) { String str1 = "中文字符串"; // 将UTF-8编码字符串转换为默认编码字符String defaultEncodingStr = EncodingUtils.convertToDefaultEncoding(str1, "UTF-8"); System.out.println("Default Encoding: " + defaultEncodingStr); // 将默认编码字符串转换为GBK编码字符String targetEncodingStr = EncodingUtils.convertToEncoding(defaultEncodingStr, "GBK"); System.out.println("Target Encoding: " + targetEncodingStr); } } ``` 在上述示例中,工具类`EncodingUtils`提供了两个静态方法。`convertToDefaultEncoding()`方法将指定编码字符串转换为默认编码字符串,而`convertToEncoding()`方法将默认编码字符串转换为指定编码字符串。 ### 回答2: Java字符编码转换工具类是一种用于处理字符编码转换的工具类,它可以将字符串从一种字符编码转换为另一种字符编码。在Java中,字符串的编码可以使用标准的UTF-8、UTF-16、ISO-8859-1等编码方式。 这个工具类通常提供以下几种方法: 1. `toUTF8(String str)`:将字符串从其他编码转换为UTF-8编码。 2. `fromUTF8(String str)`:将UTF-8编码字符串转换为其他编码。 3. `toISO88591(String str)`:将字符串从其他编码转换为ISO-8859-1编码。 4. `fromISO88591(String str)`:将ISO-8859-1编码字符串转换为其他编码。 使用这个工具类可以避免在转换编码时出现乱码或者字符串不可识别的问题。例如,当我们从外部资源读取数据时,如果字符串的编码与程序默认字符编码不一致,就会导致乱码,这时可以使用这个工具类进行编码转换。 在实现这个工具类时,可以使用Java提供的相关类库,如`java.nio.charset.Charset`、`java.nio.CharBuffer`等类来进行编码转换操作。首先,通过指定源编码和目标编码,创建`Charset`对象;然后,使用`encode`方法将源字符编码成字节序列,并使用目标`Charset`对象的`decode`方法将字节序列解码成目标编码字符串。 使用这个工具类时,需要注意的是源编码和目标编码必须是支持的字符编码,否则会抛出编码不支持的异常。此外,还应该注意对输入的异常情况进行处理,例如空字符串或空指针异常,以确保程序的健壮性。 总之,Java字符编码转换工具类是一个方便实用的工具,可以帮助我们在不同编码间进行转换,避免乱码的问题,提高程序的稳定性和可靠性。 ### 回答3: Java提供了许多内置的工具类来方便字符编码转换。其中最常用的工具类是`java.nio.charset.Charset`和`java.lang.String`类。 首先,`Charset`类包含了许多常见的字符集,比如UTF-8、GBK、ISO-8859-1等。我们可以使用`Charset.forName(String charsetName)`方法来获取指定字符集的一个实例。 接下来,`String`类提供了几个方法来进行字符编码转换。其中最常用的是`getBytes(String charsetName)`方法,它将字符串按照指定的字符集转换为字节数组。例如,如果我们想将字符串转换为UTF-8编码的字节数组,可以使用`getBytes("UTF-8")`方法。 除了将字符串转换为字节数组,`String`类还提供了`getBytes()`方法,它将字符串按照默认的字符集转换为字节数组。默认的字符集可以通过调用`Charset.defaultCharset()`方法获取。 另外,如果我们想将字节数组转换为字符串,可以使用`String`类的构造方法`String(byte[] bytes, Charset charset)`。该构造方法将字节数组按照指定的字符集转换为字符串。 除了上述的方法,还有一些其他的工具类可以辅助字符编码转换。比如,`java.io.InputStreamReader`和`java.io.OutputStreamWriter`类提供了将字节流与字符流进行转换的功能。 总结来说,Java提供了丰富的工具类来进行字符编码转换。我们可以通过`Charset`类获取指定字符集的实例,通过`String`类的相关方法来进行字符串与字节数组之间的转换。另外,还可以使用`java.io.InputStreamReader`和`java.io.OutputStreamWriter`类进行字节流与字符流之间的转换。这些工具类的使用可以方便地实现字符编码转换的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值