LINUX.ORG.RU

Избитая тема: кодировка имен файлов

 , ,


1

3

Файлы с инды с неправильно кодировкой записали на самба шару с не верной кодировкой. в результате получились имена файлов крокозябрами (классика). Казалось бы:

ls -1 | iconv -f WINDOWS-1252 -t CP866
#но нет
iconv: недопустимая входная последовательность в позиции 0
. ls -1

С перекодировкой справляется онлайн декодор лебедева, но он пропускает буквы.

Œу­ицип ль­ый ст ­д рт 04.12.2014.doc
методик  оце­ки 04 12 2014.doc
. Хотя способ переименования руками не самый удобный (но перекодировка явно возможна).

Что не нравится iconv? как переименовать файлы?


пробовал

.. | perl -MEncode -e 'binmode(STDIN);binmode(STDOUT);$|=1;while(<STDIN>){Encode::from_to($_,"cp1252","cp866");print;}'
выдает одни вопросики

DeeZ ()

Либо принудительно -c указывай, либо используй enconv.

Пример:

cat ~/bin/rename_translit
#!/bin/sh

rmspaces
for Name in `ls -1`
do
    Newname=`echo "$Name"|enconv|sed -e \
    "y/йукенгзхъфывапролдэсмитьбЙУКЕНГЗХЪФЫВАПРОЛДЭСМИТЬБ/jukengzh'fyvaproldesmit'bJUKENGZH'FYVAPROLDESMIT'B/"\
    -e "s/ц/tz/g"	\
    -e "s/ш/sh/g"	\
    -e "s/щ/sch/g"	\
    -e "s/ж/zh/g"	\
    -e "s/ч/ch/g"	\
    -e "s/ю/yu/g"	\
    -e "s/я/ya/g"	\
    -e "s/ё/yo/g"	\
    -e "s/Ё/YO/g"	\
    -e "s/Ц/TZ/g"	\
    -e "s/Ш/SH/g"	\
    -e "s/Щ/SCH/g"	\
    -e "s/Ж/ZH/g"	\
    -e "s/Ч/CH/g"	\
    -e "s/Ю/YU/g"	\
    -e "s/?/_/g"	\
    -e "s/Я/YA/g"`
    if [ "$Name" != "$Newname" ]; then
        mv "$Name" "$Newname"
	echo -e "$Name   ->    $Newname                             \r\c"
    fi
    if [ -d "$Newname" ]; then
    cd "$Newname" 2>/dev/null
	if [ $? == 0 ]; then
		echo -e "\n\nDiving into $Newname"
		rename_translit
		cd ../
	fi
    fi
done

И юзверям объяснить, что не-ASCII символы в имени файла — моветон.

anonymous ()

Только предположение о «неверных кодировках», можно попробовать:

ls -1 | iconv -f cp1252 -t cp850 | iconv -f cp866
anonymous ()
Ответ на: комментарий от Belen

Оба варианта не подходят:

convmv
cp866 doesn't cover all needed characters for

ls -1 | iconv -f cp1252 -t cp850 | iconv -f cp866
iconv: недопустимая входная последовательность в позиции 3
DeeZ ()
Ответ на: комментарий от anonymous

enconv ничего. даже не меняет имен. скрипт предложенный выше так же не работает.

ls -1 | enconv
Œã­¨æ¨¯ «ì­ë© áâ ­¤ àâ 04.12.2014.doc

DeeZ ()

WINDOWS-1252

А почему ты решил, что там оно?

no-such-file ★★★★★ ()
Ответ на: комментарий от DeeZ

ls, вероятно «съедает» символы, которые считает управляющими, предложу:

ls -1 -N | iconv -c -f utf8 -t cp1252
anonymous ()

Потыкал сейчас, действительно оно, но символы таки безвозвратно потеряны.

$ echo '㭨樯 «ì­ë© áâ ­¤ àâ 04.12.2014'|iconv -f utf-8 -t cp1252 |iconv -f cp866 -t utf-8

уницип льный ст нд рт 04.12.2014

Посмотрел в hex, 7 символ действительно пробел, так что... oops. Ну или ls не всё рисует.

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Спаисбо за наводку. Почти работает :)))

 for i in *; do echo $i | iconv -f utf-8 -t cp1252 | iconv -f cp866 -t utf-8 ; done
половина имен перевелось нормально. На другие ругается (видимо нужно первый символ отбросить).

DeeZ ()
Ответ на: комментарий от DeeZ

Не, ну это все хорошо конечно, но сами файлы как переименовывать планируется? Пока я вижу только попытки посмотреть как же они назывались.

iconv только перекодирует текст и не более того, но не меняет кодировку имен файлов

Belen ★★ ()
Ответ на: комментарий от Belen

пока задача только убедиться что имена нормальные полностью и имена можно получить. далее можно переименовать уже как угодно, зная реальные имена (пока самая безумная идея ориентироваться на хэши, и по ним потом переименовать)

DeeZ ()

man enca

Он тебе определит как и что там закодировано, ты явно путаешь набор кодировок, которые надо применить

anonymous ()
Ответ на: комментарий от anonymous

В первом сообщении ссылка есть на файлик с именами, можете убедиться что там 1252->866

DeeZ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.