[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Проблемы с локалями в zip-архивах, созданных под виндой (названия файлов под дебиан выглядят кракозябельно)



On 10.03.2010 12:55, James Brown wrote:
> ОС - Lenny AMD64
> UnZip 5.52 of 28 February 2005, by Debian (консоль)
> File Roller 2.22.4 (ГУИ)
> 
> Вот такой ужос происходит при распаковывании архива консольной командой:
> Archive:  Kipnis Evidence 2010 February.zip
>    creating: Kipnis Evidence 2010 February/
>    creating: Kipnis Evidence 2010 February/1 ����Ӫ᡿�. ������-����Կ�. ����
> Вот так выглядит сей ужос в ГУЕ:
> http://img59.imageshack.us/img59/2760/screenshotarm.png
> 
> Как побороть?

1) распаковывать: LC_ALL=C 7z x /path/to/file.zip
(почему не unzip? потому что unzip слишком умный и думает, что знает в какой
кодировке оно было [cp437], и какая кодировка у тебя [latin1], и перекодирует;
разумеется, думает он неправильно, в результате получается мусор)
2) угадывать кодировку (русские обычно в cp866, японские - sjis/cp932, и так
далее); в сложных случаях я использую python-chardet и ls|chardet [см. аттач]
3) переименовывать: convmv -f cp866 -t utf-8 --notest -r
#!/usr/bin/python
import sys
import urllib
from chardet.universaldetector import UniversalDetector

def fchardet(usock):
	detector.reset()
	for line in usock.readlines():
	    detector.feed(line)
	    if detector.done: break
	detector.close()
	usock.close()
	return detector.result

detector = UniversalDetector()
if len(sys.argv) < 2:
	print fchardet(sys.stdin)
else:
	for u in sys.argv[1:]:
		print u
		print fchardet(urllib.urlopen(u))

Reply to: