`

java中GB2312 To Utf-8字符互换

    博客分类:
  • java
阅读更多
实现思路大致如下:
取得一个汉字的Unicode码
把Unicode码分解为两个16进制数据字符串(丢弃前两个字节)
把这两个16进制数据字符串转换成二进制数据字符串
把二进制数据字符串分解为三个串,第一个串为4(0~4)个位,在高位加上标记位“1110”,第二(4~10)、三个(10~16)串均为6个位,分别在高位加上“10”标记位
把这三个二进制串分别转换为10进制数据并赋值给字节型数组
根据这个字节型数组构造UTF-8字符
java 代码

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.UnsupportedEncodingException;  
 
/** 
* 2007-8-10 jyin at gomez dot com 
*/ 
public class CharsetConvertor {  
    public static void main(String[] args) {  
        String str = "This is a test for *中网!@#$。,?";  
        try {  
            File f = new File("D:/test.txt");  
            FileOutputStream fio = new FileOutputStream(f);  
            String s = gbToUtf8(str);  
            fio.write(s.getBytes("UTF-8"));  
            fio.close();  
        }  
        catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 
    public static String gbToUtf8(String str) throws UnsupportedEncodingException {  
        StringBuffer sb = new StringBuffer();  
        for (int i = 0; i < str.length(); i++) {  
            String s = str.substring(i, i + 1);  
            if (s.charAt(0) > 0x80) {  
                byte[] bytes = s.getBytes("Unicode");  
                String binaryStr = "";  
                for (int j = 2; j < bytes.length; j += 2) {  
                    // the first byte  
                    String hexStr = getHexString(bytes[j + 1]);  
                    String binStr = getBinaryString(Integer.valueOf(hexStr, 16));  
                    binaryStr += binStr;  
                    // the second byte  
                    hexStr = getHexString(bytes[j]);  
                    binStr = getBinaryString(Integer.valueOf(hexStr, 16));  
                    binaryStr += binStr;  
                }  
                // convert unicode to utf-8  
                String s1 = "1110" + binaryStr.substring(0, 4);  
                String s2 = "10" + binaryStr.substring(4, 10);  
                String s3 = "10" + binaryStr.substring(10, 16);  
                byte[] bs = new byte[3];  
                bs[0] = Integer.valueOf(s1, 2).byteValue();  
                bs[1] = Integer.valueOf(s2, 2).byteValue();  
                bs[2] = Integer.valueOf(s3, 2).byteValue();  
                String ss = new String(bs, "UTF-8");  
                sb.append(ss);  
            } else {  
                sb.append(s);  
            }  
        }  
        return sb.toString();  
    }  
 
    private static String getHexString(byte b) {  
        String hexStr = Integer.toHexString(b);  
        int m = hexStr.length();  
        if (m < 2) {  
            hexStr = "0" + hexStr;  
        } else {  
            hexStr = hexStr.substring(m - 2);  
        }  
        return hexStr;  
    }  
 
    private static String getBinaryString(int i) {  
        String binaryStr = Integer.toBinaryString(i);  
        int length = binaryStr.length();  
        for (int l = 0; l < 8 - length; l++) {  
            binaryStr = "0" + binaryStr;  
        }  
        return binaryStr;  
    }  
}
分享到:
评论

相关推荐

    记事本软件 还原 可以高亮显示各种语法 自定义语法高亮 支持ANSI,Unicode,UTF-8等编码互换

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    <编程高亮文本编辑器>Notepad2改良版(修复特殊字符崩溃BUG)

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    conv_gbk_ibm1388:GBKIBM1388字符集转换

    这两个字符集不能通过像Unicode在UTF-8和UTF-16之间所做的操作来直接互换。 它们基于具有不同汉字顺序的不同编码(ASCII / EBCDIC)。 ICU( )支持两种字符集,但占用空间很大。 这是一种占地面积小,快速的解决...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    Notepad2源码

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    notepad2 超级给力的代码编辑器

     2 支持ANSI,Unicode,UTF-8等编码互换  3 可以设置无限个书签(9种图标可换)轻松定位  4 空格,制表符彩色显示,并可互相转换  5 可以对任意的文本块进行操作,ALT键+鼠标  6 对括号{}〔〕()可以高亮配对...

    Notepad2 V4.2.25

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    ASP高亮记事本Notepad2 V4.0.22-Final绿色汉化增强版

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    JAVA上百实例源码以及开源项目源代码

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    Notepad2 v4.1.24 和 Notepad++ 6.1.5

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    notepad2 记事本2汉化版

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    Notepad2 V2.0.19 绿色汉化版_类似系统记事本的文本编辑工具

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕...

    notepad2beta4.zip

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    java开源包4

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包101

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包11

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

Global site tag (gtag.js) - Google Analytics