zip กับชื่อ path ภาษาไทย โดยใช้ rubyzip

ผมได้รับไฟล์ .zip มา ก็ดีใจว่าอย่างน้อย ๆ ก็ใช่ไม่ .rar ที่เวลาเปิดจะลำบากขึ้นไปอีก

สมัยผมหนุ่ม ๆ เขาตั้งเชื่อไฟล์กันได้ 8 ตัวอักษาและ extension อีก 3 ตัว นอกจากนั้นก็ยังใส่ภาษาไทยไม่ได้ เดี๋ยวนี้ไม่ ใส่ภาษาไทย ใส่ช่องว่างได้หมด งานก็เข้าอีก

โปรแกรมแตกไฟล์ zip บางตัวมันก็ไม่สนใจภาษาไทยเลย อ่านแบบคิดว่าเป็น ASCII แบบ 8 bit ตลอด ๆ  ผมก็เลยลองเอา rubyzip มาเล่นดู แล้ว encode ชื่อไฟล์ใหม่เป็น UTF-8 ก็พบว่าเจ้ง เพราะว่าบางทีชื่อไฟล์ก็ไม่ใช่ UTF-8

เลยเปลี่ยนมาใช้ TIS-620 ก่อนแล้วแปลงเป็น UTF-8 อีกที ก็อ่านได้เพิ่มขึ้น แต่ก็ยังมีตัวอักษรบางตัวแปลงไม่ได้

จึงเปลี่ยนจาก TIS-620 มาใช้ Windows 874 แทน ก็ยังมีปัญหาเหลืออีกคือบางทีชื่อไฟล์เป็น UTF-8 อยู่แล้ว ก็เลยต้องมาเขียน check ก่อน


require 'zip'

def decode_path_name(name)
  if name.force_encoding("UTF-8").valid_encoding?
    name.force_encoding("UTF-8")
  else
    name.force_encoding("WINDOWS-874").encode("UTF-8")
  end
end

Zip::File.open(ARGV[0]) do |zip_file|  
  zip_file.each do |entry|
    name = decode_path_name(entry.name)
    entry.extract(name)
  end
end

พอจัดไปครบตามนี้ก็พบว่าแตกได้ทุกไฟล์แล้ว

 

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s