D 的个人博客

全职做开源,自由职业者

  menu

彻底解决Java的字符编码问题[00原创]

最近在做Mp3 ID3标签的提取,又遇到了中文字符编码的问题。
记得以前从一个文本文件中读取中文字内容时,如下方法所示:


/**
     * 按行对去读取文本文件内容
     * 
@param fileName
     *                文件路径与文件名
     * 
@throws IOException
     
*/
    
public void readFile(String fileName)
    {
    
try
    {
        InputStream is 
= new FileInputStream(fileName);

        ByteArrayOutputStream byteout 
= new ByteArrayOutputStream();
        
byte tmp[] = new byte[1024];
        
byte context[];

        is.read(tmp);
        byteout.write(tmp);
        context 
= byteout.toByteArray();
        String str 
= new String(context, "GBK");
        System.out.println(str);

    }
    
catch (FileNotFoundException fnfe)
    {
        fnfe.printStackTrace();
    }
    
catch (Exception e)
    {
        e.printStackTrace();
    }
    }

同样的方法处理ID3标签是出现了问题。
new String(context, "GBK");出来的还是乱码。。。。
查阅了各种资料,写了个简单的解决方法测试,如下:

package cn.edu.ynu.sei.liva.test;

public class CharSetDecoder
{
    
public static void main(String[] args)
    {
    
try
    {
        String musicName 
= "Ó¸ҵÄÐÄ";
        System.out.println(
"Before decoding: " + musicName);
        
// 1. 把musicName(按Unicode->ISO-8859-1) 转回原来的byte[]。
        
// 2. 因为原来的歌名是GBK编码方式,所以把bytes[] 按照GBK->Unicode的方式转码
        String musicNameDecode = new String(musicName.getBytes("ISO-8859-1"), "GBK");
        System.out.println(
"After decoding:" + musicNameDecode);
    }
    
catch(Exception e)
    {
        e.printStackTrace();
    }
    }
}

呵呵,终于可以彻底搞定Java的字符编码问题了!