`
lukew
  • 浏览: 51630 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GB2312转换为UTF-8

阅读更多
摩托罗拉的部分手机(a1200,e60等),不支持gb2312编码。曾经给我造成了不少麻烦。现在,大家可以分享解决这个问题的一些经验。

关于gb2312,unicode,utf-8的一些资料,大家请自行搜索。一下列举几个比较好的资源网址。
http://baike.baidu.com/view/25492.htm
http://www.utf.com.cn/article/s45
http://www.utf.com.cn/article/s74
http://www.haiyan.com/steelk/navigator/ref/gb2312/gbindex.htm

要点:
1,gb2312于unicode或者utf-8之间并不存在直接的映射关系。所以我们只能通过查表法来进行转换。
2,utf-8是unicode用于网络传输的一种形式,它与unicode之间是可以通过运算来进行转换的。
3,j2me环境使用的都是utf-8编码,但是请注意,j2me中的utf-8编码比较特殊,在整个编码前面对了两个字节,用于存放字符串的长度。

过程:
1,制作映射表gb2312-unicode,应为汉字的unicode比utf-8要小,这样做出的表也会小一些,而且对于unicode的可扩展性也强一些。
2,先将gb2312编码串通过查表,转换为unicode。
3,然后通过运算,将unicode转换为utf-8,以便在j2me环境下使用。

我修改了Herong Yang大侠的一个映射表生成函数,原文请参考http://www.herongyang.com/gb2312/gb2312_unicode.html
它的作用是生成一个二进制的gb2312到unicode的查找表,它按照gb2312的分区,分块特性,将其对应的unicode按顺序存入指定的位置。
这样我们只需要根据gb2312的编码,计算出索引就可以获取编码对应的unicode了。
由于是修改的代码,没脸贴出来,大家有需求可以直接参考Herong Yang的文章,然后根据自己需求修改并生成自己的映射表。

这里我把自己这个转换表文件以及访问代码公开。
http://download.csdn.net/source/263609
转帖请注明。这是个傻瓜化的代码,在java中给它gb2312的byte数组,它就给你构造出字符串。
用在不支持gb2312的手机上非常方便。这个转换表的大小是15228byte,对j2me来说还是可以接受的。

如果有朋友需要沟通,可以发邮件到hunhun1981@hotmail.com

<!---->import java.io.InputStream;
 
public class HGB2312 {
 
    
private byte[] map = new byte[15228];
 
    
private byte[] buffer;
    
private int index;
 
    
public HGB2312() throws Exception {
        InputStream is 
= getClass().getResourceAsStream("/gb2u.dat");
        is.read(map);
        is.close();
    }
 
    
public String gb2utf8(byte[] gb) throws Exception {
        buffer 
= new byte[gb.length + gb.length / 2 + 3];
        index 
= 0;
        
int c, h, l, ind;
        
for (int i = 0; i < gb.length;) {
            
if (gb[i] >= 0) {
                fillBuffer(gb[i
++]);
            } 
else {
                h 
= 256 + gb[i++];
                l 
= 256 + gb[i++];
                h 
= h - 0xA0 - 1;
                l 
= l - 0xA0 - 1;
                
if (h < 9) {
                    ind 
= (h * 94 + l) << 1;
                    c 
= (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
                    fillBuffer(c);
                } 
else if (h >= 9 && h <= 14) {
                    fillBuffer(
0);
                } 
else if (h > 14) {
                    h 
-= 6;
                    ind 
= (h * 94 + l) << 1;
                    c 
= (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
                    fillBuffer(c);
                } 
else {
                    fillBuffer(
0);
                }
            }
        }
        
// ind = index - 2;
        
// h = (byte) ((ind >> 8) & 0x7F);
        
// l = (byte) (ind & 0xFF);
        
// buffer[0] = h;
        
// buffer[1] = l;
 
        
return new String(buffer, 0, index, "UTF-8");
    }
 
    
private void fillBuffer(int value) {
        
if (value <= 0x0000007F) {
            buffer[index
++= (byte) value;
        } 
else if (value >= 0x00000080 && value <= 0x000007FF) {
            
byte b1 = (byte) (0x60 | (value >> 6));
            
byte b2 = (byte) (0x80 | (value & 0x3F));
            buffer[index
++= b1;
            buffer[index
++= b2;
        } 
else if (value >= 0x00000800 && value <= 0x0000FFFF) {
            
byte b1 = (byte) (0xE0 | (value >> 12));
            
byte b2 = (byte) (0x80 | ((value >> 6& 0x3F));
            
byte b3 = (byte) (0x80 | (value & 0x3F));
            buffer[index
++= b1;
            buffer[index
++= b2;
            buffer[index
++= b3;
        } 
else if (value >= 0x00010000 && value <= 0x001FFFFF) {
            
byte b1 = (byte) (0x1E | (value >> 18));
            
byte b2 = (byte) (0x80 | ((value >> 12& 0x3F));
            
byte b3 = (byte) (0x80 | ((value >> 6& 0x3F));
            
byte b4 = (byte) (0x80 | (value & 0x3F));
            buffer[index
++= b1;
            buffer[index
++= b2;
            buffer[index
++= b3;
            buffer[index
++= b4;
        } 
else if (value >= 0x00200000 && value <= 0x03FFFFFF) {
            
byte b1 = (byte) (0x3E | (value >> 24));
            
byte b2 = (byte) (0x80 | ((value >> 18& 0x3F));
            
byte b3 = (byte) (0x80 | ((value >> 12& 0x3F));
            
byte b4 = (byte) (0x80 | ((value >> 6& 0x3F));
            
byte b5 = (byte) (0x80 | (value & 0x3F));
            buffer[index
++= b1;
            buffer[index
++= b2;
            buffer[index
++= b3;
            buffer[index
++= b4;
            buffer[index
++= b5;
        } 
else if (value >= 0x04000000 && value <= 0x7FFFFFFF) {
            
byte b1 = (byte) (0x7E | (value >> 30));
            
byte b2 = (byte) (0x80 | ((value >> 24& 0x3F));
            
byte b3 = (byte) (0x80 | ((value >> 18& 0x3F));
            
byte b4 = (byte) (0x80 | ((value >> 12& 0x3F));
            
byte b5 = (byte) (0x80 | ((value >> 6& 0x3F));
            
byte b6 = (byte) (0x80 | (value & 0x3F));
            buffer[index
++= b1;
            buffer[index
++= b2;
            buffer[index
++= b3;
            buffer[index
++= b4;
            buffer[index
++= b5;
            buffer[index
++= b6;
        }
    }
 
    
private int byte2Int(byte b) {
        
if (b < 0) {
            
return 256 + b;
        } 
else {
            
return b;
        }
    }
}

分享到:
评论

相关推荐

    GB2312编码和UTF-8互转(c语言实现)

    GB2312编码与utf-8编码的字符串的转换,主要使用windows api函数MultiByteToWideChar和WideCharToMultiByte,代码简洁,经测试可用

    GB2312转UTF-8(C代码)

    总的来说,这个资源对于需要处理GB2312编码文本,并希望将其转换为更通用的UTF-8编码的C语言开发者来说非常有用。通过理解字符编码的基本原理,以及如何在C语言中实现编码转换,开发者可以更好地应对多语言环境下的...

    gb2312,utf-8,utf-8-bom等编码格式的互相转换

    1. 将GB2312编码的字符串转换为UTF-8: ```csharp string gb2312String = "GBK编码的字符串"; byte[] gb2312Bytes = Encoding.GetEncoding("gb2312").GetBytes(gb2312String); string utf8String = Encoding.UTF8....

    网页编码转换工具GB2312转换UTF-8

    “GB2312转换UTF-8”工具提供了一种便捷的解决方案,能够将使用GB2312编码的文件转换为UTF-8编码,确保在各种设备和浏览器上都能正常显示。同时,工具也支持反向操作,即UTF-8转GB2312,以满足特定场景的需求。 ...

    utf-8 互转 gb2312 转码

    首先,我们需要将UTF-8编码的字符串解码为Unicode,然后将Unicode转换为GB2312编码。反之,从GB2312转到UTF-8也是同样的逻辑,只是方向相反。 在Python编程语言中,我们可以使用`encode()`和`decode()`方法进行转码...

    gb2312与utf-8转换

    在实际操作中,我们有时需要将GB2312编码的文件转换为UTF-8,或者反过来,以便在不同系统或应用间进行兼容。例如,如果你收到一个GB2312编码的文档,在一个默认使用UTF-8的环境中打开可能会出现乱码。这时,就需要...

    GB2312与UTF-8互转程序,包含源代码,MAKEFILE,及最终库,百分百直接使用

    例如,如果你有一个GB2312编码的文件,而你的系统或程序默认使用UTF-8,那么你需要将GB2312转换为UTF-8才能正确显示文本。反之亦然,如果你接收到的是UTF-8编码的文本,而你的系统或程序只支持GB2312,你就需要进行...

    文件编码转换工具(GB2312与UTF-8转换) python写的一个小工具

    文件编码转换工具(GB2312与UTF-8转换) python写的一个小工具文件编码转换工具(GB2312与UTF-8转换) python写的一个小工具文件编码转换工具(GB2312与UTF-8转换) python写的一个小工具

    gb2312编码转utf-8编码

    当需要将GB2312编码的文件转换为UTF-8编码时,通常涉及以下步骤: 1. **识别编码**:首先,需要确定文件的原始编码是GB2312。这可以通过查看文件头部的字节顺序标记(BOM)或者通过专门的工具来检测。 2. **读取...

    批量文件编码转换工具(Utf-8转GB2312、GB2312转Utf-8)

    本文将深入探讨批量文件编码转换工具,特别是“Utf-8转GB2312”与“GB2312转Utf-8”的转换过程,以及如何利用此类工具进行高效操作。 标题中的“批量文件编码转换工具”是指一种能够一次性处理大量文件,改变它们...

    编码转换器 绿色版 gb2312 gbk utf-8

    标题和描述中提到的"编码转换器 绿色版 gb2312 gbk utf-8 万能转换"是一个软件工具,它能够帮助用户将文本文件从一种编码格式转换到另一种,尤其是GB2312、GBK和UTF-8这三种常见的中文编码格式。 1. **编码系统**:...

    GB2312字符与UTF-8字符互转

    LabVIEW 自带的VI,可以实现GB2312字符与UTF-8字符互,用在网络字符转换很方便。输入隐藏功能,自己很难找到。

    VB6.0 UTF-8转换GB2312函数

    在VB6.0编程环境中,有时我们需要处理不同字符编码之间的转换,例如将UTF-8编码的字符串转换为GB2312编码。UTF-8是一种广泛使用的Unicode编码,而GB2312是中国大陆常用的简体中文字符集,主要用于早期的计算机系统。...

    js gb2312和utf-8互转

    由于直接的UTF-8到GB2312的转换较为复杂,通常的做法是先将UTF-8字符串转换为Unicode格式,然后再从Unicode转换为GB2312。具体实现可以参考相关库或者利用现有的工具函数完成这一过程。 通过上述步骤,我们可以在...

    C#写的 GBK GB2312 UTF-8转换

    GBK、GB2312和UTF-8是三种常见的字符编码标准,每种都有其特定的应用场景和特点。C#作为.NET框架下的主要编程语言,提供了丰富的类库支持对不同编码格式之间的转换。 1. **GBK编码**:GBK是中国大陆广泛使用的汉字...

    UTF-8转换GB2312函数[UTF-8转换GB2312函数]-精品源代码

    UTF-8转换GB2312函数[UTF-8转换GB2312函数]-精品源代码

    UCS-2转换为utf-8代码

    UCS-2转换为UTF-8代码集完整版 UCS-2(Universal Character Set 2)是一种 Unicode 编码形式,用于表示 Unicode 字符。UTF-8(Unicode Transformation Format 8)是一种 Unicode 编码形式,用于将 Unicode 字符转换...

    批量转 GBK 转 UTF-8 gb2312 Iso-8959-1 转 UTF-8

    `convertz.rar`可能是一个包含转换工具的压缩包,它可以帮助用户快速、高效地将大量GBK、GB2312或ISO-8859-1编码的文件转换为UTF-8。这样的工具通常会扫描指定目录下的所有文件,识别其编码类型,并根据用户需求进行...

    完美转换UTF-8 到 GB2312(源代码和详细说明)

    不幸的是,广收欢迎的代码查看工具Source insight 虽然支持汉字,但是它不支持UTF-8。笔者感到疑惑的是,当初开发source insight的这帮人现在哪里去了?为何不继续开发?这么好的工具,却不再更新了,实在让人可惜。...

    VB GB2312 转UTF-8的函数.zip

    本资料包"VB GB2312 转UTF-8的函数.zip"提供了将GB2312编码转换为UTF-8编码的函数,这对于处理多语言或者历史遗留的GB2312编码的文本数据尤为关键。 GB2312(中国国家标准简体中文字符集)是一种针对中文的双字节...

Global site tag (gtag.js) - Google Analytics