您的位置:首页 > 服装鞋帽 > 女装 > 用PowerShell将CUE文件转换为UTF8编码

用PowerShell将CUE文件转换为UTF8编码

luyued 发布于 2011-06-18 18:06   浏览 N 次  

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:xialulee
最初发布于:2011年5月29日,http://blog.sina.com.cn/xialulee 他说:最近真是学会了不少转换CUE文件编码的方法啊。
我说:还不是拜你的FTP服务器和你的那些好用户所赐。
他说:让我想想现在已经知道几种方法了。1) 用Python,使用codecs和第三方库chardet,自动递归目录,自动编码检测,自动编码转换,一下子就将服务器里所有的CUE文件转换成foobar2000可用的utf8编码的CUE。这是你教给我的第一种方法(见《将所有的CUE文件都转换为UTF8编码》)。
我:是的。和FireFox的自动编码检测有相同的性能,因为chardet就是用Mozilla的技术实现的。
他:2) 用GnuWin32的iconv转换(见《将CUE文件转换成UTF-8时要加BOM》)。
我:嗯,不要忘了BOM头。没有BOM的UTF8 CUE不能被foobar2000识别。
他:3) 用Vim(见《用vim将cue文件转换为带BOM的utf8编码》)。
我:还是不要忘了BOM。
他:4) BAT+FireFox+Notepad(见《还是关于处理CUE文件乱码的问题》)。
他:还有昨天的5) Matlab(见《用Matlab将CUE文件转为UTF8编码》)。
他:你注意到没有,这五种方法都有一个共同点。
我:没有。
他:所有的这些方法都需要不是Windows自带的,第三方的软件,比如Python, GnuWin32, Vim, FireFox, Matlab等等。有没有什么方法,直接利用Windows自带的工具完成这样的工作?
我:IE+Notepad。
他:有没有方便进行批量处理的?
我:PowerShell。如果用Vista或Win7,这个是标准配置。如果XP,那还得自己装,如果是98,95,3.x,估计没希望了。
他:现在用Win7的人还是蛮多的。PowerShell干这个方便吗?
我:很方便,因为它的语言具有shell的特点,同时又能使用庞大的dotNet库。
他:具体怎么做呢?
我:首先当然是读取文件内容:
PS C:\lab> $c = cat .\CDImage.cue -Encoding Byte;
他:这个cat和Linux中的cat一样吗?
我:其实有很大区别,本质上它是Get-Content的别名。
他:后面的那个-Encoding参数的意义是什么?
我:-Encoding Byte,用来指示让cat将文件内容原封不动地读进来,不做任何编码转换之类的事情,而且返回值为装着Byte的数组类型,你看:
PS C:\lab> $c.GetType().Name
Object[]
PS C:\lab> $c[0].GetType().Name
Byte
我:接下来获取编码器。你这个CUE文件是shift_jis编码的,那就获取一个shift_jis的编码器:
PS C:\lab> $enc = [System.Text.Encoding]::GetEncoding('shift_jis');
我:再接下来,就是用这个编码器$enc对文件内容$c进行编码,并将结果保存到文件中,且保存时的编码为UTF8:
PS C:\lab> $enc.GetString($c) | sc CDImage_UTF8.cue -Encoding UTF8;
他:sc是什么?
我:Set-Content的别名。通过-Encoding参数可以指定保存时的编码方式。类似Vim的fileencoding。
他:不用插入BOM头么?
我:Microsoft的东西,当然会自动插入BOM头了,就像notepad一样。
他:如果我想批量处理,递归遍历一个目录,将里面所有的CUE进行转换呢?
我:可以ls+foreach,比如:
PS C:\lab> foreach ($cue in ls -filter *.cue -recurse) {
>> #do something
>> }
在#do something那里加上编码转换的代码就可以了。
他:$cue是什么类型?
我:FileInfo:
PS C:\lab> $cue.GetType().Name
FileInfo
你可以用它的FullName方法得到文件的完整路径。
他:文件名如何拆分呢?比如原文件名为CDImage.cue,我想将编码之后的文件命名为CDImage_UTF8.cue。
我:这有点伤脑筋啊。查查MSDN,好像FileInfo里没有用来拆分文件名的方法,只有Name,FullName和Extension。只好手工来做了,比如,假设文件名为:
PS C:\lab> $name = 'CDImage.ape.cue';
先拆分:
PS C:\lab> $parts = $name -split '\.'
得到数组$parts
PS C:\lab> $parts
CDImage
ape
cue
在数组倒数第二个元素添加“_UTF8”:
PS C:\lab> $parts[-2] += '_UTF8';
将$parts合并为一个字符串:
PS C:\lab> $new_name = $parts -join '.';
PS C:\lab> $new_name
CDImage.ape_UTF8.cue
完成。
我:将上面的这些代码整理整理,就能得到用于批量转换的脚本了。只是没有自动编码检测的功能,所以还是Python比较能干。
他:有空的时候试试。
图文资讯
广告赞助商