Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Зарегистрирован:
20/8/2008 9:35 Из: АРК, Судак
Сообщений:
0
Уровень : NAN
HP : NAN / NAN |
Внимание всех, кто по разным причинам использует системную локаль отличную от UTF8!
Послу долгих ковыряний в сети и многодневных экспериментов удалось побороть проблему, которая имеется в КДЕ3, связанную с неправильным отображением присоединяемых устройств, а именно компакт и двд дисков, флешек и дискет. На счет внешних винчестеров - не гарантирую, тут все очень неавтоматически, но вполне может сказаться что и сработает! В моей системе установлена локаль ru_RU.CP1251, посему везде указываю для себя iocharset=cp1251. Для других локалей прописывайте там свою! 1) идем в папку /bin и создаем там подпапку /trying. переносим файл /bin/mount в нее, то есть будет теперь /bin/trying/mount 2) создаем в /bin обработчик монтирования для флешек: текстовый файл /bin/mount #!/bin/bash # Change Additional mount options with IOCHARSET and CODEPAGE you need # Additional mounting options (cyrillic correction) additional_options=",iocharset=cp1251,codepage=1251" echo $* # Use correction vfat=0 # Result Message (was used for debuging) message="" # Maximum parameters count Num=0 # Filling the array of input parameters for input_param in $* do let "Num++" # Increment Num params[$Num]=$input_param done # Main checking cycle (check mount input parameters) for ((i=1; i <= Num ; i++)) do # Checking if FS type specified if [ ${params[$i]} = "-t" ]; then if [ ${params[$i+1]} = "vfat" ]; then let "vfat = 1" let "i++" message=$message"Found FSType VFAT" fi # Checking if Mounting Options specified elif [ ${params[$i]} = "-o" ]; then let "i++" # go to the next parameter (mount options themself) params[$i]=${params[$i]}"$additional_options" # update mount options fi done # This part makes mounting with additional parameters or with standard parameters depending # on filesystem type if [ $vfat -eq 1 ]; then # Filling new mount options parameters="" for (( i=1; i <= Num; i++ )) do parameters=$parameters"${params[$i]} " done # mount /bin/trying/mount $parameters else /bin/mount_sr0 $* fi echo $parameters 3) аналогично далее для cd-rom (если монтируется по имени sr0) текстовый файл /bin/mount_sr0 #!/bin/bash # Change Additional mount options with IOCHARSET and CODEPAGE you need # Additional mounting options (cyrillic correction) additional_options=",iocharset=cp1251" echo $* # Use correction vfat=0 # Result Message (was used for debuging) message="" # Maximum parameters count Num=0 # Filling the array of input parameters for input_param in $* do let "Num++" # Increment Num params[$Num]=$input_param done # Main checking cycle (check mount input parameters) for ((i=1; i <= Num ; i++)) do # Checking if FS type specified if [ ${params[$i]} = "/dev/sr0" ]; then if [ ${params[$i]} = "/dev/sr0" ]; then let "vfat = 1" let "i++" message=$message"Found FSType CDROM" fi # Checking if Mounting Options specified elif [ ${params[$i]} = "-o" ]; then let "i++" # go to the next parameter (mount options themself) params[$i]=${params[$i]}"$additional_options" # update mount options fi done # This part makes mounting with additional parameters or with standard parameters depending # on filesystem type if [ $vfat -eq 1 ]; then # Filling new mount options parameters="" for (( i=1; i <= Num; i++ )) do parameters=$parameters"${params[$i]} " done # mount /bin/trying/mount $parameters else /bin/mount_cdrom $* fi echo $parameters 4) аналогично далее для cd-rom (если монтируется по имени cdrom) текстовый файл /bin/mount_cdrom #!/bin/bash # Change Additional mount options with IOCHARSET and CODEPAGE you need # Additional mounting options (cyrillic correction) additional_options=",iocharset=cp1251" echo $* # Use correction vfat=0 # Result Message (was used for debuging) message="" # Maximum parameters count Num=0 # Filling the array of input parameters for input_param in $* do let "Num++" # Increment Num params[$Num]=$input_param done # Main checking cycle (check mount input parameters) for ((i=1; i <= Num ; i++)) do # Checking if FS type specified if [ ${params[$i]} = "/dev/cdrom" ]; then if [ ${params[$i]} = "/dev/cdrom" ]; then let "vfat = 1" let "i++" message=$message"Found FSType CDROM" fi # Checking if Mounting Options specified elif [ ${params[$i]} = "-o" ]; then let "i++" # go to the next parameter (mount options themself) params[$i]=${params[$i]}"$additional_options" # update mount options fi done # This part makes mounting with additional parameters or with standard parameters depending # on filesystem type if [ $vfat -eq 1 ]; then # Filling new mount options parameters="" for (( i=1; i <= Num; i++ )) do parameters=$parameters"${params[$i]} " done # mount /bin/trying/mount $parameters else /bin/mount_fd0 $* fi echo $parameters 5) аналогично для дисковода (имя /dev/fd0) текстовый файл /bin/mount_fd0 #!/bin/bash # Change Additional mount options with IOCHARSET and CODEPAGE you need # Additional mounting options (cyrillic correction) additional_options=",iocharset=cp1251" echo $* # Use correction vfat=0 # Result Message (was used for debuging) message="" # Maximum parameters count Num=0 # Filling the array of input parameters for input_param in $* do let "Num++" # Increment Num params[$Num]=$input_param done # Main checking cycle (check mount input parameters) for ((i=1; i <= Num ; i++)) do # Checking if FS type specified if [ ${params[$i]} = "/dev/fd0" ]; then if [ ${params[$i]} = "/dev/fd0" ]; then let "vfat = 1" let "i++" message=$message"Found FSType FLOPPY" fi # Checking if Mounting Options specified elif [ ${params[$i]} = "-o" ]; then let "i++" # go to the next parameter (mount options themself) params[$i]=${params[$i]}"$additional_options" # update mount options fi done # This part makes mounting with additional parameters or with standard parameters depending # on filesystem type if [ $vfat -eq 1 ]; then # Filling new mount options parameters="" for (( i=1; i <= Num; i++ )) do parameters=$parameters"${params[$i]} " done # mount /bin/trying/mount $parameters else /bin/trying/mount $* fi echo $parameters всем этим файлам нужно присовить владельца root:root и дать права на выполнение для всех и запись только для рута, остальным на чтение как видно эти скриптовые файлики ссылаются друг на друга, то есть при вызове команды mount идет проверка параметров по цепочке - сначала для устройств с явно указаной системой vfat (флешки и разделы винчестера), затем оптические устройства по имени вначале для sr0 (для opensuse 11.0 - дефолтное имя в HAL) затем по имени cdrom, а затем для флоппи привода (дисковода). Естественно расчитано это все только на то, что приводов по одной штуке в системе, то есть еслли несколько дисководов или оптических приводов - естественно нужно расширять скрипты. После того как эти файлы созданы и им назначены соответствующие права - работает все на ура! ЕДИНСТВЕННОЕ УСЛОВИЕ: при первом использовании устройства нужно в конквероре правой кнопкой мыши вызвать свойства тома, найти опции монтирования и убрать галочку с "монтировать в UTF8" - только после этого имена будут показываться правильно. Для умников: Без скриптов эта галочка до одного места, так как КДЕ плевать хотел на то, что если не используется УТФ8, то по логике нужно прописать -o iocharset=<locale> . Если бы он это делал все работало бы искаропки, как говорится. Теперь просьба: товарищи, которые сильны в написании bash-скриптов и их отладке! Пожалуйства, оптимизируйте эти скрипты по возможности до одного файла с интуитивно понятным описанием внутри, а то я как-бы понять могу, но сам исправить - не шарю
Отправлено: 27/11/2008 18:24
Отредактировано пользователем SwitNJ 27/11/2008 18:45:34
|
||||||||||
Трансфер |
Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Web-мастер
Зарегистрирован:
13/3/2008 21:03 Из: open-suse.ru
Сообщений:
1
Уровень : 1
HP : 0 / 0 |
в статьи надо бы ло забацать, если это уже основной варинат решения, а здесь оставить ветку как обсуждение статьи.
Сделать?
Отправлено: 28/11/2008 7:13
|
||||||||||
Трансфер |
Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Зарегистрирован:
20/8/2008 9:35 Из: АРК, Судак
Сообщений:
0
Уровень : NAN
HP : NAN / NAN |
в статью рано, ибо решение что называется очень сырое, хоть и работоспособное.
Товарищ AX на linux.org.ru подсказывает что скрипт можно сделать намного проще при помощи регэкспов, но я в этом деле не соображаю. Если он откликнется и поможет доделать дкрипт, то я бы вообще хотел статейку общую выложить о настройке машин под опенсусе на локаль 1251 (для сращивания с виндовым окружением, включая сеть). У меня лично это больная тема, ибо в корпорации таких машинок много. Можно сказать, что с этим скриптом завершился бы большой этап по интеграции...
Отправлено: 28/11/2008 15:53
|
||||||||||
Трансфер |
Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Web-мастер
Зарегистрирован:
13/3/2008 21:03 Из: open-suse.ru
Сообщений:
1
Уровень : 1
HP : 0 / 0 |
ну ладно тогда, подождем немного, а как прояснится дайте знать, опубликуем обязательно ну и естессна желаю успехов и чтобы все получилось как хотелось
Отправлено: 29/11/2008 17:11
|
||||||||||
Трансфер |
Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Зарегистрирован:
20/8/2008 9:35 Из: АРК, Судак
Сообщений:
0
Уровень : NAN
HP : NAN / NAN |
Итак.. окончательный результат.
Вроде бы все работает. Проверялось на флешках, на оптических носителях (на дискетах к сожалению не успел (но проверял до этого в 11.0 - работало), так как с установкой опенсусе 11.1 из системы напрочь пропал /dev/fd0 - об этом глюке отдельно поговорить надо). Итак.. по порядочку. Во-первых - огромный респект товарищу AX (linux.org.ru), который помогал мне доводить до ума скрипт (http://www.linux.org.ru/view-message. ... ocache=-560865565#3314885) Во вторых, спасибо тем кто откликнулся в помощи по работе с симлинками и с регэкспами (http://www.linux.org.ru/view-message. ... ocache=1594829517#3307630) (http://www.linux.org.ru/view-message. ... ocache=-707814850#3305032). Очень познавательно вышло. А теперь по сути. А) идем в папку /bin и переименовываем /bin/mount в /bin/mount_true Б)создаем сам скрипт /bin/mount (права выставить в root:root , rwx r-x r-x) #!/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/mount_true $parameters Как это работает? 1) скрипт перехватывает параметры, передаваемые в mount 2) выделяется имя точки монтирования. если она на utf8 (то есть отображается крокозябрами) то имя приводится к нормальному, путем создания символической ссылки в виде правильного имени на корявое. если такая ссылка уже есть или название ссылки английское - оставляем как есть. ЭТО ВАЖНО, так как оптические диски с метками на русском языке просто напросто не будут монтироваться вообще. 3) из параметров монтирования удаляется опция (,)utf8(=true). если ее оставить то никакие iocharset не помогут. 4) если это оптический диск (cd/dvd) то добавляем опции ",iocharset=cp1251" 5) если это диск с vfat или же это флоппик - добавляем в опции ",iocharset=cp1251,codepage=1251" 6) производим монтирование с поправленными опциями. Побочный эффект: 1) на экран попадает отладочная информаци (можете сами закоментировать строки с echo ... | tee -a ... 2) после переустановки системы или обновления системы монтирования (что редко оооочень) нужно положить скрипт куда следует заново - смотри пункт А) 3) создаются симлинки в кириллице на автоматические точки монтирования с неправильной кодировкой. По извлечении диска симлинки становятся мертвыми. Решение: 3.1) создаем файлик /bin/delsymlinks с правами на выполнение для всех. #!/bin/bash for link in $(find /media -type l); do test -e $link || rm $link ; done 3.2) идем в /etc/crontab и добавляем туда строку */1 * * * * root /bin/delsymlinks 3.3) выполняем от пользователя root перезагрузку шедулера: service cron restart (по крайней мере в 11.1 оно так) Все! После этого каждую минуту запускаемый скрипт проверяет папку /media/ на наличие мертвых симлинков и в случае обнаружения - удаляет их. И более НИЧЕГО не нужно шаманить ни в каких fstab, hal и прочих, потому как первое неудобно а второе вообще никак толком не работает. Что касается версий окружения - будет работать везде, независимо от версии КДЕ, может даже и под ГНОМОМ, а какая ему разница? Скажу только что в КДЕ 4.1 более недоступна функция просмотра опций монтирования для устройств, как было в 3.5.. там хоть можно было снять "монтировать в утф8". А! и еще.. если что-то от руки не получается примонтировать по команде mount - выполяйте с консоли команду mount_true заместо mount.
Отправлено: 15/12/2008 15:59
|
||||||||||
_________________
стиль жизни "эксперимент -> 3.14$дец -> чтение документации" |
|||||||||||
Трансфер |
Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Зарегистрирован:
3/12/2008 6:40 Из: Красноярск
Сообщений:
0
Уровень : NAN
HP : NAN / NAN |
Простите за банальность, это проблема всех пользователей кед касается? Сколько пользовался не замечал проблем с кодировкой на носителях, только на ресурсах сети(SMB, ftp...), по дефолту в кедах стоит cp1251.
Отправлено: 15/12/2008 17:34
|
||||||||||
_________________
openSUSE 11.2(x86) || Linux 2.6.31 || KDE 4.4 AMD Sempron(tm) 2600+ || RAM 1.5 Gb || ATI Radeon 9600 Было бы сказано, а забыть успеем |
|||||||||||
Трансфер |
Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Зарегистрирован:
20/8/2008 9:35 Из: АРК, Судак
Сообщений:
0
Уровень : NAN
HP : NAN / NAN |
вам наверное просто повезло, в отличии от моих 30 машинок начиная от 10.3 и до 11.1 включительно :)
есть разница между прописать локаль для отдельной программы и локаль для всей системы. у меня последний случай. когда кде работает под утф8 - никаких проблем и в самом деле нету. Что касается среды выполнения - всех КДЕ поголовно. В гноме вроде бы есть свой монтировщик, но я не любитель гнома и ничего про него сказать не могу, за исключением того что у него все настройки раскиданы нелогично и их через зад делать надо.
Отправлено: 15/12/2008 17:45
|
||||||||||
_________________
стиль жизни "эксперимент -> 3.14$дец -> чтение документации" |
|||||||||||
Трансфер |
Re: Кодировка имен файлов в КДЕ на CD/DVD, FLOPPY, FLASH |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Зарегистрирован:
3/12/2008 6:40 Из: Красноярск
Сообщений:
0
Уровень : NAN
HP : NAN / NAN |
SwitNJ в любом случае, огромное Вам спасибо за проделанную работу!
Отправлено: 15/12/2008 17:56
|
||||||||||
_________________
openSUSE 11.2(x86) || Linux 2.6.31 || KDE 4.4 AMD Sempron(tm) 2600+ || RAM 1.5 Gb || ATI Radeon 9600 Было бы сказано, а забыть успеем |
|||||||||||
Трансфер |