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
() автор топика
Ответ на: Есть такая штука convmv от olegkrutov
convmv
cp866 doesn't cover all needed characters for... 

Не понимат.. Спотыкается на некоторых символах например C2 8C не понимает что это буква Д.

DeeZ
() автор топика

man enca

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

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

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

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