现在从sd卡读取音乐文件和歌词文件时会出现乱码问题。
1.读音乐文件是通过查询sd卡来实现,方法如下:
try {
// 歌曲名升序排列
String orderBy = MediaStore.Audio.Media.TITLE + " COLLATE LOCALIZED ASC";   
mCursor = getContentResolver().query(MUSIC_URL, mCursorCols,
"duration >= 5000", null, orderBy);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "onCreate() getContentResolver ERROR.");
}
// ...
// 获取当前播放歌曲名
public String getTitleByPosition(Cursor c, int position) {
c.moveToPosition(position);
int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE);
return c.getString(titleColumn).trim();
}这是读取的title就有时候应该是出现了乱码,还没有跟踪确认。但最终显示在TextView中出现乱码。2.读歌词文件是用BufferedReader读取一行数据,然后解析
类似于下面这种方法:
/**  
119.     * 以行为单位读取文件,常用于读面向行的格式化文件  
120.     *   
121.     * @param fileName  
122.     *            文件名  
123.     */  
124.    public static void readFileByLines(String fileName) {   
125.        File file = new File(fileName);   
126.        BufferedReader reader = null;   
127.        try {   
128.            System.out.println("以行为单位读取文件内容,一次读一整行:");   
129.            reader = new BufferedReader(new FileReader(file));   
130.            String tempString = null;   
131.            int line = 1;   
132.            // 一次读入一行,直到读入null为文件结束   
133.            while ((tempString = reader.readLine()) != null) {   
134.                // 显示行号   
135.                System.out.println("line " + line + ": " + tempString);   
136.                line++;   
137.            }   
138.            reader.close();   
139.        } catch (IOException e) {   
140.            e.printStackTrace();   
141.        } finally {   
142.            if (reader != null) {   
143.                try {   
144.                    reader.close();   
145.                } catch (IOException e1) {   
146.                }   
147.            }   
148.        }   
149.    }   
150.  读取的tempString就是乱码,通过System.getProperty("file.encoding")得到当前系统字符集为UTF-8,用
String str = new String(tempString.getBytes(), "UTF-8");
str还是乱码。这是什么原因呢?是不是要像
System.getProperty("file.encoding")   得到当前系统字符集
content.getBytes(System.getProperty("file.encoding")),"GBK") 通过当前字符集转码
http://hi.baidu.com/sxhyll/blog/item/3f234ab1b1514e5f0823022e.html
这样设置?

解决方案 »

  1.   

    乱码,烦死我了。
    有一些音乐我是在日文机器上拷贝到sd卡的英文音乐,结果在TextView中文件名显示也会乱码。
      

  2.   

    这个肯定是编码问题了,就是从文件中读取数据的编码不能正确地转换到android可以显示的编码格式
    先弄清楚文件中数据的编码格式,然后转换就行了。
      

  3.   

    http://blog.csdn.net/yiyaaixuexi/archive/2011/02/14/6183114.aspx
    去这看看能不能解决
      

  4.   

    谢谢!研究研究!
    还不明白,我用BufferedReader读一行的时候该怎么分析编码?
      

  5.   

    不管是什么编码的音乐文件,想要在Android上显示正确,就必须转换为utf-8格式编码(xml中作了定义),才能正确显示字符。 对不同编码的文件,有不同的转化方法是肯定的。但是要判断一个现成的文件(歌词语言多国化)是个什么编码方式,用程序写实在不好办呀。 可以在windows下使用一些第三方工具查看编码方式的,     英文歌曲最好办了,因为不管什么编码 英文都是0---128这段区域。  不用转码照样也可以读取争正确的!因为ASCII码1字节搞定,不会被拆乱。      纠正你的一个观念,utf-8不是字符集,它是一种编码方式,  你有见过zh_CN.utf-8  zh_CN.gb2312 吗?这些才叫字符集~~~~~          在dalvik/........../Locale.java  有相关内容 不妨看看哦~~
      

  6.   

    content.getBytes(System.getProperty("file.encoding")),"GBK") 通过当前字符集转码
    GBK是中文  你不是日文系统么.......  好乱啊 
      

  7.   

    哦哦哦哦哦哦哦那GBK没有错  是我搞错   你的android系统启动默认值设置是中文?
      

  8.   

    我的模拟器是设置成中文的,真机也是中文的。另外,我工程文件,UI所在类文件的编码是GBK的,但歌词解析类文件是UTF-8的。
    这个有没有影响?
      

  9.   

    我也有问题想问,但是没有分,也不能发帖 csdn 怎么这么郁闷啊
      

  10.   

    我是这样解决的BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(url),"GB2312"));
      

  11.   

    我对上层java不是很了解-。-  一般乱码问题都是发生在底层扫描文件的时候,乱码传到上层java就更乱了hoho,   我很好奇英文歌曲怎么还会乱码呢?????什么样的乱码??莫非全是符号??????????若是转码问题,通常都是奇形怪状的文字,英文字符ASCII码怎么个乱法?   所以我想应该不是编码的问题。如果歌名、歌手、专辑、等信息是都是英文的话~~~~~~~             
      

  12.   

    从你的代码里我看不出乱码的原因。 
    我同样也看不出 你怎么识别解析mp3文件里的title \ artist\等tag信息的。 ID3有v1和v2两个版本,分别把tag信息写在mp3文件的结尾128字节,和开头。     你从哪里读取的title,开头么????    
    强烈要求描述乱码的样子~~~~  
      

  13.   


    乱码现象,如图。
    读取方法如1L,查询的列有:
    String[] mCursorCols = new String[] { MediaStore.Audio.Media._ID,
    MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
    MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
    MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ALBUM_ID,
    MediaStore.Audio.Media.ARTIST_ID,
    MediaStore.Audio.Media.DISPLAY_NAME,
    MediaStore.Audio.Media.DURATION };
      

  14.   

    现在我把歌词文件存为utf-8格式的,再上传到模拟器,已经没有乱码了。原先是unicode格式的就乱码。
    当歌词文件.lrc为unicode格式时,
     while(reader.ready()) {
        String lineTemp = reader.readLine();
        Log.d(TAG, "lineTemp:" + lineTemp); // 输出乱码
                
        String line = new String(lineTemp.getBytes("utf-8")).trim(); // 通过当前字符集转码
         Log.d(TAG, "line:" + line); // 输出乱码
      

  15.   

    从网上下载到电脑上默认应该是ansi编码。
      

  16.   

    那是我搞错,是中文曲名乱码,英文歌曲只是歌手有乱码,可能是歌曲里面保存的歌手是中文的。
    网上有的说用iTunes修改下就不会乱码了,有的是用千千静听播放过导致乱码,没搞明白。
    还有就是从电脑上下载的歌词默认是ANSI编码的,转换为utf-8也还是乱码怎么解决呢?
    我现在只是把ANSI编码的lrc另存为utf-8编码解决的。如果是在手机上下载,下载后的编码是什么格式的呢?
      

  17.   


    你把ANSI编码的lrc另存为utf-8编码,可以解决肯定没问题。转换为utf-8肯定也是没问题的,但是为什么还是乱码呢?我猜,因为你以为在java里以"utf-8"方式getbytes 就是成功正确的转码了。其实不是的。
    ANSI编码是本地化编码,如果当前是中文系统,就默认GB2312编码。如果当前是日文系统,就默认为JIS编码。2字节存储一个文字。即使是英文,也是2字节来存储。(很浪费空间)
    Unicode是一种国际化的字符集,各国文字的字符区域都不重复,然而utf-8呢,是Unicode的一种编码方式。  对待英文和中文以及各种文字,都是不同字节数的。
    所以 在转换为utf-8的时候搞不清楚哪字节和哪字节是一个文字了,拆分错误,就乱码拉。如果是手机上下载,那歌词肯定也是ANSI,由手机当前的系统语言决定具体到底是什么编码。
      

  18.   

    “iTunes修改下就不会乱码了,有的是用千千静听播放过导致乱码”iTunes其实就相当于一个第三方转码工具。具备成功转换为utf-8功能的工具。 你想想,为了应对各种乱七八糟编码的mp3 tag信息和歌词,转码工作不得不写成个独立的工具软件了。在java上层 ,岂能是几句话就可以成功转码的?呵呵...至于千千静听,因为是windows下的,中文系统打开mp3文件,-----> GB2312..... 
    Android:utf-8 。结果:乱码。
    我刚刚做完在Android下音乐播放器同时解析简体中文,繁体中文,日文,韩文的mp3 tag信息的工作。都是在cpp里操作的,对上层java不是很了解,如果有什么地方说错了,还望你指出。
      

  19.   

    不要这么谦虚嘛,真的非常感谢!学习ing
      

  20.   

    .....不管什么格式都转成UNICODE就可以了吧
      

  21.   

    好 羡慕你们的小花勋章哇  ^.^能转赠不??haha
      

  22.   


        理论上是这样的,但是实际操作不好实现。Android就非常讨厌,单说mp3信息处理这一块,它默认针对日文采用ANSI中的JIS,繁体中文采用ANSI中的BIG5,韩文采用UNICODE的UCSKR,中文简体采用不是ANSI更不是UNICODE的GBK... 但是我们在程序里基本没有什么好办法来判断这些奇奇怪怪的数字到底表示的是哪国语言,所以只能采取统一的处理方式,所以通常会发现,中文没乱码了,韩文全是乱码等现象。    查表是个方法,但是是个多么多么吓人的方法啊!
      

  23.   


    GBK和GB2312的简体中文编码是一样的吧?据说兼容阿
      

  24.   


    是一样的为什么要起两个名字?
    GB2312 英文中文都2字节存储
    GBK 英文1字节,中文2字节存储
      

  25.   

    那倒是,那么说用GBK比GB2312要节省空间
    不知道效率上哪个高点,为什么又要有两种编码呢?
      

  26.   


    肯定GBK省空间呀。 因为GB2312能够收录的汉字太少,我们汉字博大精深哇哈哈哈,就衍生了GBK,又增加收录了几千个汉字。具体几千我也忘记了-。-
      

  27.   


    嗯啊, 有高手开发好不? 没见到市面上有那款Android手机或者平板电脑不需要自己手动转码(千千静听)就都OK的
      

  28.   

    buffer=new BufferedReader(new InputStreamReader( urlcon.getInputStream(),"GB2312"));
    这样读取出来 就ok了  
      

  29.   

    我这边遇到一个问题, 通过改编码为 “GBK”后,在android 模拟器上可以正常显示 中文,但是在真机上还是显示乱码。这是怎么回事?请大侠指点下。。
      

  30.   

    可以明确的说:15楼的处理方法过于简单,肯定不能适用所有的情况。
    我现在使用15楼的方法,就是在windowsxp下运行读文件正常,但是同样的代码在android模拟器下就乱码
      

  31.   

    我遇到了乱码,你能帮我看看吗?
    乱码信息头如下:
    11-08 06:30:36.408: INFO/System.out(523): LrcProcessor--->temp:ID3
    我把这个歌词文件的title \ artist\等tag信息都删除了,还是出现乱码问题!
      

  32.   

    我也遇到这个问题了。mp3歌曲不是utf-8格式的。(用千千静听转utf-8后显示正常)
    手机上显示出来的是乱码。
    数据库db里的对应字段也乱了。看来是扫描卡里数据时写进数据表时就乱了。
    LZ 这问题你是怎么解决的?
      

  33.   

    额,看到大牛们的讨论,我很惶恐,我也是写个自己的音乐播放器,也遇到乱码,今晚本来想用15楼的方法,但是比较麻烦,几经尝试一番,strTitle = new String(mAudioCursor.getString(indexTitle).getBytes(),"UTF-8"); 发现居然好了,不现实乱码了,嘿嘿,可能是巧合吧,我用的和楼主一样的方法,但是读取到的 歌曲名 前面有个  “=”号,有点奇怪...