`
RednaxelaFX
  • 浏览: 3019439 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

把FireFox转义了的文件名转回来……

    博客分类:
  • Ruby
阅读更多
呵呵又是文件重命名相关的脚本……总之先记下来免得以后要用又得重新敲代码。

刚重装了系统,换到英文的XP了。把默认locale还是设在了中文上,不然以前用的一些CP936的程序可能就要乱码了。可是我没把FireFox的默认语言设为中文,结果用FireFox下某些附件的时候,中文字符就变成转义过的UTF-8了——一个汉字变成三个“%nn”的形式表示的字节。颇郁闷。其实一开始还没发觉是UTF-8,还以为就是把文件名按照系统默认locale给转义了而已;后来发觉字节数不对,才想起是UTF-8。
File::rename只能接受系统默认locale的字符串为参数,直接把转回来的UTF-8字符串仍给它还不行,非要再从UTF-8转回到GBK才行。诶那如果我把默认locale设回到英语了这个地方该怎么弄……||||

随手写了个脚本来转换:
#!/usr/bin/env ruby
require 'iconv'

def unescape_utf8(str)
  str.gsub /%([a-zA-Z0-9]{2})/ do
    "%c" % $1.to_i(16)
  end
end

def utf82locale(str, locale)
  Iconv.conv locale, 'UTF-8', str
end

def unescape2locale(str, locale)
  utf82locale unescape_utf8(str), locale
end

def rename_escaped(filename)
  File.rename filename, unescape2locale(filename, 'GBK')
end

def rename_escaped_in_dir(dir)
  Dir.entries(dir).grep(/(?:%[a-zA-Z0-9]{2}){3}/) do |filename|
    rename_escaped filename
  end
end

if __FILE__ == $0
  rename_escaped_in_dir ARGV[0] || '.'
end


没弄清楚怎么获取当前系统的locale,干脆就把'GBK'硬编码进去了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics