LINUX.ORG.RU

Кодировка файловых систем флешек, флопика и CD/DVD


0

0

Проблема с кодировками! Пользую openSUSE 11.0 + KDE 3.5.10. Локаль 1251 (нужна позарез для правильного отображения файлов на SMB/FTP ресурсах).

Так вот - по сети и локально все работает отлично, но когда втыкаешь флешку или дискету или компакт/двд привод с файлами на русском - имена отображаются в крокозябрах - два символа на букву в названии. В общем нечто с кодировкой UTF-8. Когда скопирую файлы и поделаю им convmv с указанием из UTF-8 в cp1251 - имена восстанавливает, но это как крайняя мера и не всегда годится. Что и где поправить чтобы отображались правильные имена файлов ВСЕГДА ? Судя по всему это так криво работает HAL. И , кстати, заметил еще что при монтировании vfat опция -iocodepage недопустима! все врямя на нее ругается что бы не написал.. в мануале написано что опция допустима а на деле нет! то есть примеры из интернета для монтирования не катят - крокозябры остаются (это когда я пробовал фат раздел винчестера примонтировать).

Кто что знает? колитесь!


>И , кстати, заметил еще что при монтировании vfat опция -iocodepage недопустима! все врямя на нее ругается что бы не написал.. в мануале написано что опция допустима а на деле нет!

Не знаю, в каких мануалах такое написанно, а для vfat всю жизнь были только iocharset и codepage.

AX ★★★★★
()

>(нужна позарез для правильного отображения файлов на SMB/FTP ресурсах).

чем монтируете?

timth ★☆
()

Для smb надо использовать перекодировку. man smb.conf

Для ftp - тоже. Качай файлы с помощью нормального клиента, который поддерживает перекодировку.

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

>>KDE 3.5.10

>>(нужна позарез для правильного отображения файлов на SMB/FTP ресурсах).

>чем монтируете?

Прозреваю Smb4K/конкверрор

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

1) монтирую сетевые ресурсы через mount.cifs - раз и на весь сеанс 2) все мои 30 юзеров работающих как тупые клиенты ходят в самбу (те ресурсы, которые не примонтированы через mount.cifs) и на фтп (которые по всей стране в кодировке 1251) через krusader или через mc. никакой конqurer и smb4k не работали, не работают и не будут никогда работать нормально с сетью. Забудьте, дохлый номер.

3) Ответа по сути так и не последовало - как же сделать так, чтобы устройства монтировались в правильной кодировке автоматически?

SwitNJ
() автор топика
Ответ на: комментарий от AX

извините, ошибся при наборе сообщения. на самом деле так и пробовал iocharset и codepage. Но iocharset в самом деле не работает! видимо полагает что ее изменять нельзя и устанавливает ее то ли не понятно во что, то ли во взятую из locale

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

>Решение нашел сам и выложил его вот здесь: http://open-suse.ru/modules/newbb/viewtopic.php?viewmode=flat&type=&t.. .

Скрипты жгут! %)) Вот решение поизящней: http://hatred.homelinux.net/wiki/zhurnal:2008-08-12_09.22_kde4_i_montirovanie....

Вообще советую осилить регэкспы и sed, твоя возня с разложением параметров на массив, поиском ключей и пр. легко решается одной строкой: echo $* | sed -r s/"-o [[:alnum:],]*"/\&$additional_options/ .

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

спасибо за подсказку! эту ссылку я находил одной из первых и пробовал ее. Не работает оно в КДЕ3, иначе я бы уже давно успокоился! Что касается скриптов. Их делал тоже не я, я лишь быстро руками поправил то что смог догнать (а вообще я в скриптах не шарю), и поставил цепочкой. добавить опции регекспом это хорошо, меньше возни чем с массивами. могёшь поправить скрипт так, чтобы: 1) изменять параметры только для явно указанных /dev/sr0[1,2..] , /dev/cdrom[0,1,2..], dev/floppy, /dev/fd0[1,2,..] и для тех устрочств где явно указано -t vfat 2) удалять utf8[=true] из параметров если оно указано (это избавило бы от необходимости снимать галочку монтирования в утф8 и юзер бы никогда об этом даже не задумывался) осилишь?

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

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
additional_options=",iocharset=cp1251,codepage=1251"

# Removing utf8[=true]
parameters=`echo $* | sed -r s/"utf8(=true)?"//`

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr0[[:alnum:]]\|cdrom\|fd0[[:alnum:]]\|floppy\)\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then
        # update mount options
        parameters=`echo $* | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options/`
fi

echo $parameters

# mount
/bin/trying/mount $parameters

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

Только всё-равно это - плохое решение, ибо /bin/mount будет перезаписываться при каждом обновлении, лучше таки попробовать заставить работать правила hal. В крайнем случае можно перенастроить udev, чтобы он вызывал какой-нибудь /usr/local/mount, тогда скрипт надо будет немного изменить.

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

спасибо огромное за ответ! потестирую этот скриптик.. пытался в него вникнуть.. голову сломать сможно :) А как перенастривать udev ? HAL я уже пробовал.. но дело в том что команду на монтирование ему отдает KDE3, который нагло игнорирует его настройки :( и еще.. utf8(=true) удаляется как в варианте utf8, так и в варианте utf8=true ? ПС. как бы с тобой связаться? мой ICQ 311-498-228

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

ага! и еще один ньюанс - для CD/DVD опцию ",codepage=1251" добавлять нельзя.. как бы это в скриптик внести такое изменение? Если ты мог заметить то в скриптах для /dev/sr0 /dev/cdrom применяется только ",iocharset=1251"

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

>пытался в него вникнуть.. голову сломать сможно :)

http://gazette.linux.ru.net/rus/articles/abs-guide/c12143.html
http://gazette.linux.ru.net/rus/articles/abs-guide/x4165.html - про expr

>А как перенастривать udev ?


Через параметр RUN в правилах udev (правда сам не проверял), примерно как здесь: http://wiki.archlinux.org/index.php/Udev_(Русский)#.D0.90.D0.B2.D1.82.D0.BE.D...
Возможно, можно даже без скриптов обойтись.. =)

>( и еще.. utf8(=true) удаляется как в варианте utf8, так и в варианте utf8=true ?


Да.

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

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
default_additional_options=",iocharset=cp1251,codepage=1251"
additional_options_cdrom=",iocharset=cp1251"

# Removing utf8[=true]
parameters=`echo $* | sed -r s/"utf8(=true)?"//`

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr0[[:alnum:]]\|cdrom\)\)' > /dev/null ); then
# update mount options for cdrom
parameters=`echo $* | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/`
elif ( expr "$parameters" : '.*\(/dev/\(fd0[[:alnum:]]\|floppy\)\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then
# update mount options for other
parameters=`echo $* | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/`
fi

echo $parameters

# mount
/bin/trying/mount $parameters

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

супер! и кажись, последнее: 1) как бы вместе с echo $parameters еще и выводить не только на экран но и в лог-файл? 2) на счет кавычек.. то ли это так и надо что везде применяются и " ' и ` то ли сайт сам все поковеркал и везде надо заменить на " ? а то уже было так - скопировал с сайта а оно не работало именно из-за того что везде надо было ставить двойные кавычки.

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

>супер! и кажись, последнее: 1) как бы вместе с echo $parameters еще и выводить не только на экран но и в лог-файл?

Добавь в начало скрипта log_file="твой лог-файл" и замени 'echo $parameters' на 'echo $parameters | tee "$log_file"'.

>на счет кавычек.. то ли это так и надо что везде применяются и " ' и ` то ли сайт сам все поковеркал и везде надо заменить на " ?


Нет, так и должно быть, каждый тип кавычек несёт разную функцию.

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

скопировал один к одному. скрипт не работает :( вставляю сд-ром. смотрю в логах. передается в mount: -t iso9660 -o nosuid,nodev,uid=1000,noatime, /dev/sr0 /media/update_11.0

обнаруживается в в /media/.hal-mtab: /dev/sr0 1000 0 iso9660 nosuid,nodev,uid=1000,noatime,utf8 /media/update_11.0

опции не прикрепились, utf8 не удалилось (вообще непонятно откуда возникло.. но если отключить в свойствах монтирования КДЕ "в кодировке УТФ-8" то и не появляется) :(

может с кавычками все-же проблема?

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

может нужна скобка не ` а ' ? и еще.. как сделать чтобы лог файл не перезатирался, а вывод добавлял новые данные в конец?

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

>может нужна скобка не ` а ' ?

Нет, апострофы обозначают, что в переменную нужно занести результат выполнения команды, а не саму строку 'echo $* | sed -r s/"utf8(=true)?"//'. А проблема была в том, что при обновлении параметров нужно было делать 'echo $parameters', а не 'echo $*'.

Исправленный вариант (лог-файл не перезаписывается):

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
default_additional_options=",iocharset=cp1251,codepage=1251"
additional_options_cdrom=",iocharset=cp1251"
log_name="твой лог-файл"

# Removing utf8[=true]
parameters=`echo $* | sed -r s/"utf8(=true)?"//`

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr0[[:alnum:]]\|cdrom\)\)' > /dev/null ); then
        # update mount options for cdrom
        parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/`
elif ( expr "$parameters" : '.*\(/dev/\(fd0[[:alnum:]]\|floppy\)\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then
        # update mount options for other
        parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/`
fi

echo $parameters | tee -a "$log_name"

# mount
/bin/trying/mount $parameters

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

:( все-равно не работает... сделал вывод в логфайл до и после обработчика. результат нулевой

mount до -t iso9660 -o nosuid,nodev,uid=1000,noatime, /dev/sr0 /media/update_11.0 после -t iso9660 -o nosuid,nodev,uid=1000,noatime, /dev/sr0 /media/update_11.0

.hal-mtab /dev/sr0 1000 0 iso9660 nosuid,nodev,uid=1000,noatime,utf8 /media/update_11.0

опять же, блин, непонятно почему несмотря на то что скрипт вырезал utf8 из параметров - тем не менее опция приписалась сама? или как это понимать?.. бред.. может это из-за того что в конце параметров осталась запятая и надо удалять [,]utf8[=true] ?

а вот почему не добавились параметры кодировок?..

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

поправил на (,)utf8(=true) - запятая убралась, по отладке видно.. но в .hal-mtab оно так и материализовалось опять.. 8-/

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

А если так?

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
default_additional_options=",iocharset=cp1251,codepage=1251"
additional_options_cdrom=",iocharset=cp1251"
log_name="твой лог-файл"

# Removing utf8[=true]
parameters=`echo $* | sed -r s/"utf8(=true)?"//`

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr\|cdrom\)[[:alnum:]]*\)' > /dev/null ); then
# update mount options for cdrom
parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/`
elif ( expr "$parameters" : '.*\(/dev/\(fd\|floppy\)[[:alnum:]]*\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then
# update mount options for other
parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/`
fi

echo $parameters | tee -a "$log_name"

# mount
/bin/trying/mount $parameters

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

>но в .hal-mtab оно так и материализовалось опять..

Подозреваю, что в .hal-mtab пишутся параметры, передаваемые нашему скрипту, т.е. параметры ДО модификации. Реальные опции монтирования можно увидеть в /etc/mtab или запустив mount без параметров.

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

в самом деле, в .hal-mtab попало только то, что передавалось из КДЕ скрипт на этот раз работает отлично! по крайней мере с cd-rom. с остальными еще не проверял.

Заметил интересный глюк: если метка диска из русских букв, то кде в списке устройств отображает саму метку правильно, а при монтировании передает имя в UTF-8, потом ругается что такая папка не найдена и открывает пустое окошко. при этом на самом деле монтирование происходит но в крокозябрах. если вставить команду iconv для преобразования в кодировку 1251, то уже возникает другая проблема - перед тем как смонтировать диск создается каталог в который монтирование должно произойти, и создается он в кодировке утф-8, а попытка примонтировать к переконвертированному имени пути естественно не удается, и процесс монтирования прерывается за отсутствием пути куда нужно примонтировать, папка созданная в кодировке утф8 удаляется. как бы это побороть?

передполагаю что сделать это можно, если сделать симлинк на утф8 имя директории в правильной кордировке, для этого надо выделить подстроку /media/имя папки , преобразовать ее по iconv и выполнить команду ln. но поскольку я в регэкспах не шарю, подскажешь как это сделать? На счет морального аспекта в плане засерания симлинками после отмонтирования - беру на свою совесть, может потом придумаю как побороть. по крайней мере они становятся неактивными после отмонтирования устройства... да и не так много русских меток бывает на самом деле, можно изредка и руками почистить.

на данный момент у меня скрипт уже выглядит вот так (правильное имя диретории монтирования отображается только в логе):

#!/bin/bash # Change Additional mount options with IOCHARSET and CODEPAGE you need # Additional mounting options (cyrillic correction) default_additional_options=",iocharset=cp1251,codepage=1251" additional_options_cdrom=",iocharset=cp1251" log_name="/var/log/mount.log"

echo "Sended to mount:" | tee -a "$log_name" echo $* | tee -a "$log_name"

#как бы оно должно было бы выглядеть, если бы КДЕ передавал имя для монтирования в 1251, а не в утф8 echo $* | iconv -f UTF-8 -t cp1251 | tee -a "$log_name"

# Removing [,]utf8[=true] parameters=`echo $* | sed -r s/"(,)utf8(=true)?"//`

echo "Removing UTF8:" | tee -a "$log_name" echo $parameters | tee -a "$log_name"

# Checking if FS type or Mounting Options specified if ( expr "$parameters" : '.*\(/dev/\(sr\|cdrom\)[[:alnum:]]*\)' > /dev/null ); then # update mount options for cdrom parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/` elif ( expr "$parameters" : '.*\(/dev/\(fd\|floppy\)[[:alnum:]]*\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then # update mount options for other parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/` fi

echo "Corrected for CD/DVD/USB(vfat)/FLOPPY:" | tee -a "$log_name" echo $parameters | tee -a "$log_name"

# mount /bin/trying/mount $parameters

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

упс... покоробило текст!

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
default_additional_options=",iocharset=cp1251,codepage=1251"
additional_options_cdrom=",iocharset=cp1251"
log_name="/var/log/mount.log"

echo "Sended to mount:" | tee -a "$log_name"
echo $* | tee -a "$log_name"
echo $* | iconv -f UTF-8 -t cp1251 | tee -a "$log_name"

# Removing [,]utf8[=true]
parameters=`echo $* | sed -r s/"(,)utf8(=true)?"//`

echo "Removing UTF8:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr\|cdrom\)[[:alnum:]]*\)' > /dev/null ); then
# update mount options for cdrom
parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/`
elif ( expr "$parameters" : '.*\(/dev/\(fd\|floppy\)[[:alnum:]]*\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then
# update mount options for other
parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/`
fi

echo "Corrected for CD/DVD/USB(vfat)/FLOPPY:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# mount
/bin/trying/mount $parameters

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

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
default_additional_options=",iocharset=cp1251,codepage=1251"
additional_options_cdrom=",iocharset=cp1251"
log_name="/var/log/mount.log"

echo "Sended to mount:" | tee -a "$log_name"
echo $* | tee -a "$log_name"
echo $* | iconv -f UTF-8 -t cp1251 | tee -a "$log_name"

# Get mount point name
mount_point=`expr "$tst" : '.*\(/media/[^ \t\n]*\)'`
# Create symlink in /media/ directory
ln -s "$mount_point" "`echo $mount_point | iconv -f UTF-8 -t cp1251`"

# Removing [,]utf8[=true][,]
parameters=`echo $* | sed -r s/"(,utf8(=true)?|utf8(=true)?,)"//`

echo "Removing UTF8:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr\|cdrom\)[[:alnum:]]*\)' > /dev/null ); then
	# update mount options for cdrom
	parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/`
elif ( expr "$parameters" : '.*\(/dev/\(fd\|floppy\)[[:alnum:]]*\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then
	# update mount options for other
	parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/`
fi

echo "Corrected for CD/DVD/USB(vfat)/FLOPPY:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# mount
/bin/trying/mount $parameters

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

понял! исправил $tst на $* и заработало тестирую дальше..

SwitNJ
() автор топика
Ответ на: комментарий от AX

вот теперь пошли проблемы со ссылками... почему-то выходит создание ссылки на саму ссылку :( как бы поправить скрипт так, чтобы НЕ создавать ссылку, если 1) ссылка в утф8 = ссылке в 1251 (имя сплошь на латинице) 2) каталог/ссылка с таким именем уже есть

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

#!/bin/bash
# Change Additional mount options with IOCHARSET and CODEPAGE you need
# Additional mounting options (cyrillic correction)
default_additional_options=",iocharset=cp1251,codepage=1251"
additional_options_cdrom=",iocharset=cp1251"
log_name="/var/log/mount.log"

echo "Sended to mount:" | tee -a "$log_name"
echo $* | tee -a "$log_name"
echo $* | iconv -f UTF-8 -t cp1251 | tee -a "$log_name"

# Get mount point name
mount_point=`expr "$*" : '.*\(/media/[^ \t\n]*\)'`
# Get try mount point name
try_mount_point=`echo $mount_point | iconv -f UTF-8 -t cp1251`
# Create symlink in /media/ directory
if [ ! "$try_mount_point" == "$mount_point" ] && [ ! -e "$try_mount_point" ];then
	ln -s "$mount_point" "$try_mount_point"
fi

# Removing [,]utf8[=true][,]
parameters=`echo $* | sed -r s/"(,utf8(=true)?|utf8(=true)?,)"//`

echo "Removing UTF8:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# Checking if FS type or Mounting Options specified
if ( expr "$parameters" : '.*\(/dev/\(sr\|cdrom\)[[:alnum:]]*\)' > /dev/null ); then
	# update mount options for cdrom
	parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$additional_options_cdrom/`
elif ( expr "$parameters" : '.*\(/dev/\(fd\|floppy\)[[:alnum:]]*\)' > /dev/null ) || ( expr "$parameters" : '.*\(-t vfat[[:blank:]]\)' > /dev/null ); then
	# update mount options for other
	parameters=`echo $parameters | sed -r s/"-o [[:alnum:],-_=]*"/\&$default_additional_options/`
fi

echo "Corrected for CD/DVD/USB(vfat)/FLOPPY:" | tee -a "$log_name"
echo $parameters | tee -a "$log_name"

# mount
/bin/trying/mount $parameters

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

>mount_point=`expr "$*" : '.*\(/media/[^ \t\n]*\)'`

Кстати, '/media/[^ \t\n]*' лучше заменить на '/media/[^[:blank:]]*'.

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