Pages

11/05/2010

คำสั่งเปลี่ยน encoding ของไฟล์

สมมุติสถานการณ์ว่า  ไปดาวน์โหลดzipไฟล์มาอันนึง (จากประเทศไทย)
แล้วพอแตกไฟล์ออกมา ปรากฎว่า เจอไฟล์อะไรไม่รู้ อยู่ภายใต้อะไรไม่รู้..
จะทำยังไง??

Assume ว่า  encoding บนระบบทั้งหมด ใช้ UTF-8    แล้วที่มันอ่านไม่ออกนี่แสดงว่า encoding ของชื่อไฟล์มันผิด

จะรู้ได้ไงว่า ที่ถูกคืออะไร?

ก็ลอง save มาเป็นไฟล์ซักอันนึง แล้วเอาไปเปิดในโปรแกรมที่ลองหลายๆ encoding ได้ดู (ในที่นี้จะใช้ firefox)
1. ก็เริ่มจาก save ก่อน

มาทดลองเปิดหลายๆ encoding ในที่สุดก็เจอว่า เปน encoding TIS-620 มันถึงจะอ่านออกนี่เอง

ซ้าย encoding=ISO-8859-1 (western) , ขวา encoding=TIS-620 (thai)

คราวนี้ ถ้าอยากจะเปลี่ยน encoding ของไฟล์ที่ชื่อ name.html ไปเลยล่ะ  ให้ระบบอ่านได้
ก็ต้องเปลี่ยนจาก TIS-620 ให้กลายเป็น UTF-8
ตรงนี้แหละ วิธีธรรมดามันก็มี ก็คือก๊อปไปแปะ แล้วสร้างไฟล์ใหม่ทำนองนั้น
แต่เรามีวิธีง่ายกว่า ด้วยคำสั่ง  iconv

iconv -f TIS-620 -t UTF-8 name.html  > name2.html

หมายถึง เปลี่ยนจาก (from)  TIS-620
ไปเป็น (to)   UTF-8
ของข้อมูลในไฟล์ที่ชื่อ name.html
แล้วredirect ไปใส่ไฟล์ชื่อ name2.html


จะเห็นว่าจากเดิม name.html ที่อ่านไม่ออกใน command เริ่มอ่านออกแล้ว ในไฟล์ name2.html

แต่ทว่า...  นี่มันก็แค่ข้อมูลในไฟล์ที่เปลี่ยน  แต่ตัวไฟล์จริงๆ ที่นามสกุล .mp3 มันก็ยังไม่เปลี่ยน
จะทำไงให้มันเปลี่ยนดี?

ตอนแรกก็ว่าจะมานั่งเปลี่ยนมือทีละไฟล์  มันก็จะเหนื่อยไป (ถ้ามันมีเยอะๆ)

พอมาคิดว่าจะทำ script   ก็งงๆอยู่ว่าจะเขียนยังไงดี  ให้ rename file ทีละอัน ด้วยชื่อไฟล์ที่ได้รับจาก ไฟล์ชื่อ name2.html

อ้อ!! หรือว่าจะสั่งให้มัน rename ตามชื่อที่ได้รับการแปลงจาก iconv แล้ว
คราวนี้พอไปดูว่า iconv มีคำสั่งรับ String เฉยๆแล้วแปลงให้มั๊ย..  ก็เปล่า
ดังงั้นเราเลยต้องโกงนิดๆ ด้วยการส่งเข้าไปแบบ pipe

ls | iconv -f TIS-620 -t UTF-8
ได้เป็น

ptantiku@ptantiku-desktop:~/Downloads/test/folder_���ͺ$ ls | iconv -f TIS-620 -t UTF-8
เพลงที่สอง.mp3
เพลงที่หนึ่ง.mp3
เพลงสุดท้าย.mp3
ptantiku@ptantiku-desktop:~/Downloads/test/folder_���ͺ$

นับว่าไม่เลว.. ถ้างี้เราก็สั่ง rename ได้เลยรวด  ด้วย for loop
for $f in *.mp3; do  mv $f   `echo $f | iconv -f TIS-620  -t UTF-8`;  done

ซึ่งก็ใช้ไ้ด้ระดับนึง   แต่ถ้าเป็นพวกไ่ม่ชอบจำ script ยาวๆ มันก็ลำบากหน่อย



จนไปเจอเครื่องมือที่ชื่อว่า  convmv   (อาจจะต้องลงเพิ่ม  ด้วย  sudo apt-get install convmv)

วิธีใช้ก็ง่ายๆเลย

convmv -f TIS-620 -t UTF-8 -r --notest  folder_*

convmv ก็จะทำการแปลง ชื่อไฟล์ทุกไฟล์ รวมถึงsub-directory ด้วย (-r)
จากencoding  TIS-620
กลายเป็น   UTF-8
ส่วน --notest มีไว้เพื่อให้ ทำการ rename แล้วเก็บไฟล์ไว้ที่เดิม (ถ้าไม่ใส่ มันจะแค่แสดงว่า มันจะเปลี่ยนชื่อเป็นอะไร แต่ไม่เปลี่ยนจริง)

และแล้ว สิ่งที่ได้ก็คือ

เรียบร้อย

No comments:

Post a Comment