听音乐,有乱码(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 }
我现在这里特别指出这个程序的几个小地方:
-
一定要用BinaryReader来打开原来的文件,这是因为我们要保留原文件的编码(Encoding)信息;
-
Encoding类可以用来进行编码转换,请注意gbkEncoding的构造方法,那是相当的简单明了;
-
注意unicodeString 的构造方法;
浙公网安备 33010602011771号