`

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;  
    }  
}
分享到:
评论

相关推荐

    UTF-8与GB2312之间的互换类.rar_ UTF-8toGB2312_UTF-8 GB2312_gb2312_mmi_ch

    标题中的"UTF-8与GB2312之间的互换类.rar_ UTF-8toGB2312_UTF-8 GB2312_gb2312_mmi_ch"指的是一个能够帮助开发者在UTF-8和GB2312两种编码格式之间进行转换的程序类库。这个压缩包可能包含了源代码文件,使得用户可以...

    基于ASP的gb2312和utf-8文件编码互换源码 v1.05.zip

    在这个"基于ASP的gb2312和utf-8文件编码互换源码 v1.05.zip"压缩包中,提供的源码显然专注于解决一个常见的问题:在ASP环境中,如何在GB2312和UTF-8两种不同的字符编码之间进行转换。 GB2312是中国大陆广泛使用的...

    文件编码转换(utf8与gbk相互转换)

    同样,如果要将UTF-8文件转换为GBK,只需将上述代码中的`'gbk'`和`'utf-8'`位置互换即可。 在实际操作中,需要注意的是,编码转换可能会丢失信息。如果原始文件中含有目标编码不支持的字符,转换后这些字符可能无法...

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

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

    中文 Big5/GBK/Unicode/UTF8 内码转换器

    UTF-8的优点在于对ASCII字符集的兼容性,使得英文字符只占用一个字节,而大部分中文字符则占用3个字节。 “中文 Big5/GBK/Unicode/UTF8 内码转换器”就是这样一个工具,它能够帮助用户在这些编码之间进行转换。比如...

    字符与Charcode互换

    了解了这些基本的转换方法后,我们还可以探讨更复杂的场景,例如处理多字节字符(如UTF-8编码的非ASCII字符)和Unicode的代理对(对于超出基本多语言平面的字符)。在处理这些情况时,需要额外的步骤和库支持,以...

    conv_gbk_ibm1388:GBKIBM1388字符集转换

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

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

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

    geojson-geometry-shp格式相互转化总结

    sds.setCharset(Charset.forName("UTF-8")); String typeName = sds.getTypeNames()[0]; // 输出gis.osm_buildings_a_free_1 // 更改表名以避免特殊字符 typeName = typeName.replace(".", "_e"); // 创建...

    新编码转换大全.rar

    2. 文件互换:跨平台的文件共享,例如Windows系统中的GBK文件传到Linux或Mac系统,可能需要转换成统一的UTF-8编码。 3. 网页开发:网页的源代码可能使用某种特定编码,而浏览器默认的编码可能不同,不匹配会导致乱码...

    字符串转换工具

    不同编码间的转换是字符串转换的重要部分,例如将GBK编码的字符串转换为UTF-8编码,以支持更多语言字符。 3. **格式化转换**:字符串可以被格式化以适应特定的输出需求,如printf样式(C/C++)、`str.format()`...

    java.net(c#)交换加密算法(java版本)

    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); ``` ####...

    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的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    Big5字与Unicode的互换

    Unicode的标准实现通常包括UTF-8、UTF-16等编码方式。 #### 四、Big5与Unicode的转换原理 由于Big5和Unicode编码方式的不同,两者之间的转换涉及到编码解码的过程。从Big5转换到Unicode,首先需要将Big5编码的字符...

    Unicode与中文互换相关

    Unicode标准中最常见的编码形式之一是UTF-8,它使用可变长度字节序列来表示字符,这使得它在互联网上的传输非常高效。 #### 三、中文与Unicode的转换 ##### 1. 将Unicode转为中文 在Java中,可以编写一个方法将...

    Notepad2源码

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

    《无废话XML》——两只老虎

    ##### 3.3.4 UTF-8与其他格式的互换 - 由于UTF-8兼容ASCII,并且可以轻松地与其他Unicode编码格式(如UTF-16)进行转换,因此它是XML文档最常用的编码方式。 ##### 3.3.5 UTF-16编码特点 - UTF-16对于大多数...

    java开源包8

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

Global site tag (gtag.js) - Google Analytics