The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Преобразование кодировок в Samba"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Преобразование кодировок в Samba"
Сообщение от kolayshkin emailИскать по авторуВ закладки(??) on 31-Май-04, 17:35  (MSK)
Всем привет! Вопрос подобный много раз уже наверное задавался много раз. Система FreeBSDd4.10&Samba2.2.8a_2. Самба не преобразовывает кодировки, хотя опции
client code page = 866
code page directory = /путь к кодировкам
Локаль KOI8-R, libiconv в системе присутствует. В чем может быть дело? Заранее спасибо.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Преобразование кодировок в Samba"
Сообщение от Keeper emailИскать по авторуВ закладки(??) on 01-Июн-04, 10:23  (MSK)
Чтобы русские имена виделись нормально с консоли, попробуй прописать в smb.conf

[global]
client code page = 866
character set = KOI8-R

Чтобы русские имена виделись нормально с виндовых ftp-клиентов, попробуй

[global]
client code page = 866
character set = 1251

Еще может понадобиться скрипт для единоразового преобразования имен файлов из 866 в KOI8-R (или 1251).

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Преобразование кодировок в Samba"
Сообщение от kolayshkin emailИскать по авторуВ закладки(??) on 01-Июн-04, 12:55  (MSK)

>[global]
>client code page = 866
>character set = KOI8-R
Спасибо

>
>Чтобы русские имена виделись нормально с виндовых ftp-клиентов, попробуй
>
>[global]
>client code page = 866
>character set = 1251

Вот только совсем не понятно: каким образом настройки в самбе повлияют на кодировку в которую будет видеть ftp клиент? Можно по-подробнее.  
А есть ли какие-нибудь готовые програмные средства которые конвертят названия из одной кодировки в другую?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Преобразование кодировок в Samba"
Сообщение от Keeper emailИскать по авторуВ закладки(??) on 01-Июн-04, 17:32  (MSK)
FTP-сервер ничего не преобразовывает, отдает как есть. Клиенты виндовые русскоязычные ходят к самбе по 866 - этого не изменить. Клиенты FTP-шные виндовые тоже ничего не преобразовывают, показывают названия как уж получают, а мы видим в кодировке 1251. Чтобы на одни и те же папки можно было ходить и по самбе, и по ФТП с винды - конвертим все один раз в 1251, а к самбе прикручиваем преобразование 866 <-> 1251.

В случае работы на локальной консоли ls, mc и прочие файл-менеджеры тоже ничего не преобразовывают и показывают как есть, а консоли кодировка по дефолту - koi8-r. Вывод - конвертим все один раз в koi8-r, а к самбе прикручиваем 866 <-> koi8-r.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Преобразование кодировок в Samba"
Сообщение от Keeper emailИскать по авторуВ закладки(??) on 01-Июн-04, 17:36  (MSK)

Дарю почти "готовое программное средство". Доработать напильником. ^_^

--- Makefile ---

NAME=   rename-to1251
SRC=    cpp
CC=     gcc
CFLAGS= -ggdb -I/usr/local/include -liconv -L/usr/local/lib
$(NAME): $(NAME).$(SRC)
        $(CC) $(CFLAGS) $(NAME).$(SRC) -o $(NAME)

--- rename-to1251.cpp ---

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <iconv.h>
#define FROM_866        1
#define FROM_KOI8       2
int action;
iconv_t conv_koi8_to_1251, conv_866_to_1251;
char cname[256];
char *valid_chars_koi8 = "ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапрол
char  valid_chars_1251 [128];
int init_action( char *arg)
{
    if (strcmp( arg, "866") == 0) action = FROM_866;
    else if (strcmp( arg, "koi8") == 0) action = FROM_KOI8;
    else action = 0;
    return action;
}
void init_valid_chars()
{
    const char * inbuf = valid_chars_koi8;
    char *outbuf = valid_chars_1251;
    size_t  inlen = strlen(inbuf);
    size_t outlen = 128;
    memset( valid_chars_1251, 0, sizeof(valid_chars_1251));
    size_t rslt = iconv( conv_koi8_to_1251, &inbuf, &inlen, &outbuf, &outlen);
}
int valid_name_1251( char *name)
{
    unsigned char *c = (unsigned char *) name;
    for (; *c; c++)
    {
        if ((*c > 128) && (strchr( valid_chars_1251, *c) == 0))
            return 0;
    }
    return 1;
}
void list_dir( char *dirname)
{
    chdir( dirname);
    printf( "Entering %s\n", dirname);
    DIR *dir = opendir( ".");
    dirent *de;
    while ((de = readdir(dir)) != NULL)
    {
        if (strcmp( de->d_name, ".") == 0) continue;
        if (strcmp( de->d_name, "..") == 0) continue;
        if (de->d_type == DT_DIR)
        {
            list_dir( de->d_name);
        }
        const char * inbuf = de->d_name;
        char *outbuf = cname;
        size_t  inlen = strlen(inbuf);
        size_t outlen = 255;;
        memset( cname, 0, sizeof(cname));
        size_t rslt = iconv( (action == FROM_866) ? conv_866_to_1251 : conv_koi8
        if (rslt != -1)
        {
            if (!valid_name_1251( de->d_name))
            {
                if (strcmp( de->d_name, cname) != 0)
                {
                    printf( "- %s -> %s\n", de->d_name, cname);
                    rename( de->d_name, cname);
                }
            }
        }
    }
    chdir( "..");
    printf( "Leaving %s\n", dirname);
}

int main( int argc, char ** args)
{
    if (init_action(args[1]) == 0) return (-1);
    conv_866_to_1251 = iconv_open( "cp1251", "cp866");
    conv_koi8_to_1251 = iconv_open( "cp1251", "koi8-r");
    init_valid_chars();
    list_dir( ".");
    iconv_close( conv_866_to_1251);
    iconv_close( conv_koi8_to_1251);
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Преобразование кодировок в Samba"
Сообщение от Keeper emailИскать по авторуВ закладки(??) on 01-Июн-04, 17:38  (MSK)
P.S. Знаю, что все это можно сделать одной-двумя строчками на шелле, но мозгов не хватает придумать, как именно. Подскажите пожалуйста, кому делать нечего!
  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Преобразование кодировок в Samba"
Сообщение от aljil Искать по авторуВ закладки(??) on 01-Июн-04, 21:29  (MSK)
>P.S. Знаю, что все это можно сделать одной-двумя строчками на шелле, но
>мозгов не хватает придумать, как именно. Подскажите пожалуйста, кому делать нечего!
>
Дело всегда найти можно.
Ну а на скорую руку мона и так:
#!/bin/sh
$Dir_to_process=blalblabla...
$Input_charset=blalblabla...
$Output_charset=blalblabla...
for file in $Dir_to_process/*
do
    myname=`echo "$file" | iconv -f $Input_charset -t $Output_charset`
    if [ -f "$file" -a "$file" != "$myname" ]
    then
        mv -f $file `dirname "$file"`/`basename "$myname"`
    fi
done
Словом, man iconv ;-)
  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Преобразование кодировок в Samba"
Сообщение от Keeper Искать по авторуВ закладки(??) on 02-Июн-04, 09:51  (MSK)

>for file in $Dir_to_process/*

О! Вот за эту строчку спасибо. Я и не знал, что так можно.

>Словом, man iconv ;-)

iconv'ом я и так пользоваться умею. ^_~

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Преобразование кодировок в Samba"
Сообщение от Keeper emailИскать по авторуВ закладки(??) on 02-Июн-04, 09:57  (MSK)
Еще вопрос: как к этому скрипту на шелле прикрутить рекурсивный обход подкаталогов?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Преобразование кодировок в Samba"
Сообщение от aljil Искать по авторуВ закладки(??) on 02-Июн-04, 13:45  (MSK)
>Еще вопрос: как к этому скрипту на шелле прикрутить рекурсивный обход подкаталогов?
>
Ну мона и так:
#!/bin/sh
$Dir_to_process=blalblabla...
$Input_charset=blalblabla...
$Output_charset=blalblabla...
for file in `find $Dir_to_process/* -type f -and -print`
do
    myname=`basename "$file" | iconv -f $Input_charset -t $Output_charset`
    if [ -f "$file" -a `basename "$file"` != "$myname" ]
    then
        mv -f "$file" `dirname "$file"`/$myname
    fi
done
Словом, типа опять man find ;-)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Преобразование кодировок в Samba"
Сообщение от Keeper Искать по авторуВ закладки(??) on 03-Июн-04, 14:42  (MSK)
Спасибо! *_*

/me пошел изучать find.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру