hack のためのネタ帳, etc,,,

Linux だと書いた文字コードでそのまま記録してくれるみたいなんだけど、
Windows の場合、少なくとも XP SP3 に Cygwin 1.7.7 の ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin] の環境だと
LANG で指定されてる文字コード以外をファイル名に与えると途中でコード自体に変な変換施されて文字化けする模様。

とりあえず以下のような感じで tempfile 実際に書いてみて文字化けしないかチェックすると良さげ。
#!/usr/bin/ruby
#
# get_effective_charcode_for_filename.rb
#
# $Id: $
#

require 'kconv'
require 'tempfile'

def get_effective_charcode_for_filename
  out_codes = {
    Kconv::EUC  => "EUC",
    Kconv::SJIS => "SJIS",
    Kconv::UTF8 => "UTF-8",
  }
  result = []
  base = Tempfile.new("").path
  fn = base + "_◎◇文字コード判別"
  [Kconv::SJIS, Kconv::EUC, Kconv::UTF8].each do |out_code|
    fn2 = fn.kconv(out_code)
    File.open(fn2, "w") do |f|
      if f.path == Dir[base + "_*"].join
        result.push out_codes[out_code]
      end
      f.close
      File.unlink(f.path)
    end
  end
  result
end

if __FILE__ == $0
#  $DEBUG = true
  p get_effective_charcode_for_filename
end

結果はこんな感じ
環境RUBYLANG結果
XP SP3, Cygwin 1.7.71.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]["UTF-8"]
XP SP3, Cygwin 1.7.71.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]ja_JP.SJIS["SJIS"]
XP SP3, Cygwin 1.7.71.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]ja_JP.EUC-JP["EUC"]
XP SP3, Cygwin 1.7.71.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]ja_JP.UTF-8["UTF-8"]
Debian, linux-image-2.6.32-5-amd641.8.7 (2010-08-16 patchlevel 302) [i486-linux]ja_JP.SJIS["SJIS", "EUC", "UTF-8"]
Debian, linux-image-2.6.32-5-amd641.8.7 (2010-08-16 patchlevel 302) [i486-linux]ja_JP.EUC-JP["SJIS", "EUC", "UTF-8"]
Debian, linux-image-2.6.32-5-amd641.8.7 (2010-08-16 patchlevel 302) [i486-linux]ja_JP.UTF-8["SJIS", "EUC", "UTF-8"]

関連

タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます