听音乐,有乱码(2)

解决了mp3文件ID3的乱码问题之后呢,我心里还是挺美的。不过……(天下事就怕这“不过”二字啊!)我听cue+ape(flac)文件的时候还是有乱码。谁叫我是一个挑剔的人呢。继续想办法吧……

当我随手打开cue文件之后,发现这种文件就是一个plain text文件。嗯,这样子问题就好办了。它就转变成了如何把GBK编码的文件转换为Unicode的文件的问题了。一段小程序分分钟搞定:

    1 using System;

    2 using System.IO;

    3 using System.Text;

    4 

    5 namespace Ggk2Unicode

    6 {

    7     class Program

    8     {

    9         static void Main(string[] args)

   10         {

   11             DirectoryInfo directoryInfo = new DirectoryInfo(args[0]);

   12             if (!directoryInfo.Exists)

   13             {

   14                 Console.WriteLine("Can't find the specified directory!");

   15                 return;

   16             }

   17 

   18             FileInfo[] fileInfos = directoryInfo.GetFiles("*.cue", SearchOption.AllDirectories);

   19             Encoding gbkEncoding = Encoding.GetEncoding("GBK");

   20             Encoding unicodeEncoding = Encoding.Unicode;

   21             foreach (FileInfo fileInfo in fileInfos)

   22             {

   23                 Console.WriteLine("processing " + fileInfo.FullName);

   24                 byte[] gbkBytes;

   25                 using (BinaryReader reader =

   26                     new BinaryReader(new FileStream(fileInfo.FullName, FileMode.Open), gbkEncoding))

   27                 {

   28                     gbkBytes = reader.ReadBytes((int)fileInfo.Length);

   29                 }

   30                 using (StreamWriter writer =

   31                         new StreamWriter(fileInfo.FullName))

   32                 {

   33                     byte[] unicodeBytes = Encoding.Convert(gbkEncoding, unicodeEncoding, gbkBytes);

   34                     char[] unicodeChars = new char[unicodeEncoding.GetCharCount(unicodeBytes, 0, unicodeBytes.Length)];

   35                     unicodeEncoding.GetChars(unicodeBytes, 0, unicodeBytes.Length, unicodeChars, 0);

   36                     string unicodeString = new string(unicodeChars);

   37                     writer.Write(unicodeString);

   38                 }

   39             }

   40         }

   41     }

   42 }

我现在这里特别指出这个程序的几个小地方:

  1. 一定要用BinaryReader来打开原来的文件,这是因为我们要保留原文件的编码(Encoding)信息;
  2. Encoding类可以用来进行编码转换,请注意gbkEncoding的构造方法,那是相当的简单明了;
  3. 注意unicodeString 的构造方法;
posted @ 2010-11-16 08:55  夜深沉  阅读(248)  评论(0)    收藏  举报