powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не открывается файл UTF-8
10 сообщений из 10, страница 1 из 1
Не открывается файл UTF-8
    #39552952
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем!
Пишу на простом C.
Пытаюсь открыть существующий файл так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
...
...
...
void ansi_to_utf8(char *out, char *in, int *l) {
    *out++='\r';
    *out++='\n';
    int len=2;
    static const char table[128][4] = {
        "\2\xD0\x82","\2\xD0\x83","\3\xE2\x80\x9A","\2\xD1\x93",
        "\3\xE2\x80\x9E","\3\xE2\x80\xA6","\3\xE2\x80\xA0","\3\xE2\x80\xA1",
        "\3\xE2\x82\xAC","\3\xE2\x80\xB0","\2\xD0\x89","\3\xE2\x80\xB9",
        "\2\xD0\x8A","\2\xD0\x8C","\2\xD0\x8B","\2\xD0\x8F",
        "\2\xD1\x92","\3\xE2\x80\x98","\3\xE2\x80\x99","\3\xE2\x80\x9C",
        "\3\xE2\x80\x9D","\3\xE2\x80\xA2","\3\xE2\x80\x93","\3\xE2\x80\x94",
        "\0","\3\xE2\x84\xA2","\2\xD1\x99","\3\xE2\x80\xBA",
        "\2\xD1\x9A","\2\xD1\x9C","\2\xD1\x9B","\2\xD1\x9F",
        "\2\xC2\xA0","\2\xD0\x8E","\2\xD1\x9E","\2\xD0\x88",
        "\2\xC2\xA4","\2\xD2\x90","\2\xC2\xA6","\2\xC2\xA7",
        "\2\xD0\x81","\2\xC2\xA9","\2\xD0\x84","\2\xC2\xAB",
        "\2\xC2\xAC","\2\xC2\xAD","\2\xC2\xAE","\2\xD0\x87",
        "\2\xC2\xB0","\2\xC2\xB1","\2\xD0\x86","\2\xD1\x96",
        "\2\xD2\x91","\2\xC2\xB5","\2\xC2\xB6","\2\xC2\xB7",
        "\2\xD1\x91","\3\xE2\x84\x96","\2\xD1\x94","\2\xC2\xBB",
        "\2\xD1\x98","\2\xD0\x85","\2\xD1\x95","\2\xD1\x97",
        "\2\xD0\x90","\2\xD0\x91","\2\xD0\x92","\2\xD0\x93",
        "\2\xD0\x94","\2\xD0\x95","\2\xD0\x96","\2\xD0\x97",
        "\2\xD0\x98","\2\xD0\x99","\2\xD0\x9A","\2\xD0\x9B",
        "\2\xD0\x9C","\2\xD0\x9D","\2\xD0\x9E","\2\xD0\x9F",
        "\2\xD0\xA0","\2\xD0\xA1","\2\xD0\xA2","\2\xD0\xA3",
        "\2\xD0\xA4","\2\xD0\xA5","\2\xD0\xA6","\2\xD0\xA7",
        "\2\xD0\xA8","\2\xD0\xA9","\2\xD0\xAA","\2\xD0\xAB",
        "\2\xD0\xAC","\2\xD0\xAD","\2\xD0\xAE","\2\xD0\xAF",
        "\2\xD0\xB0","\2\xD0\xB1","\2\xD0\xB2","\2\xD0\xB3",
        "\2\xD0\xB4","\2\xD0\xB5","\2\xD0\xB6","\2\xD0\xB7",
        "\2\xD0\xB8","\2\xD0\xB9","\2\xD0\xBA","\2\xD0\xBB",
        "\2\xD0\xBC","\2\xD0\xBD","\2\xD0\xBE","\2\xD0\xBF",
        "\2\xD1\x80","\2\xD1\x81","\2\xD1\x82","\2\xD1\x83",
        "\2\xD1\x84","\2\xD1\x85","\2\xD1\x86","\2\xD1\x87",
        "\2\xD1\x88","\2\xD1\x89","\2\xD1\x8A","\2\xD1\x8B",
        "\2\xD1\x8C","\2\xD1\x8D","\2\xD1\x8E","\2\xD1\x8F"
    };
    while (*in) {
        if (*in & 0x80) {
              const char *p = table[(int)(0x7f & *in++)];
              if (!*p)
                continue;
              *out++ = p[1];
              len++;
              if (*p == 1)
                continue;
              *out++ = p[2];
              len++;
              if (*p == 2)
                continue;
              *out++ = p[3];
              len++;
        }
        else
        {
            *out++ = *in++;
            len++;
        }
    }
    *out = '\0';
    *l=len;
}

int main(void)
{
    char *path="/home/user/log";
    int l=strlen(path)*2+3;
    char *dst = (char*) malloc (l);
    ansi_to_utf8(dst, path, &l);

    printf("%s\r\n", dst);

    setlocale(LC_ALL, "ru_RU.UTF-8");
    long h = open(dst, O_WRONLY, 0777);

    if(h==-1)
        printf("%d\r\n%s\r\n", errno, strerror(errno));
    else 
        printf("%d\r\n%s\r\n", h, dst);
    free(dst);

    write(h, "qwerty", strlen("qwerty"));
    close(h);

    return 0;
}



Дак при открытии выдаёт ошибку:
Нет такого файла или каталога.
Если не перекодировать в UTF-8, то всё открывается.
Печать после перекодировки выдаёт правильное имя файла:
/home/user/log.
Дак в чём же дело?
Заранее спасибо.
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39552961
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джек
Код: sql
1.
2.
*out++='\r';
*out++='\n';


Дак в чём же дело?

Очевидно в том, что в текущем каталоге таки нет подкаталога '\r\n'. Соответственно,
отсутствует и целый путь '\r\n/home/user/log'.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39552964
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОчевидно в том, что в текущем каталоге таки нет подкаталога '\r\n'. Соответственно,
отсутствует и целый путь '\r\n/home/user/log'.
Спасибо большое!!!
Я ansi_to_utf8 писал раньше для передачи через сокет - там переносы нужны были. Ну и взял этот кусок без изменения...
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39552999
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не хочу тебя огорчать, но в целом этот трюк с принудительной установкой локали и
перекодировкой имени файла неработоспособен чуть менее чем полностью.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39553376
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, я уже протестировал - работает.
Мне ведь надо было в rfunc (расширение firebird) дописать свои функции для работы с файлами. Которые там были -fn_fopen, fn_fwrite-они только латинский алфавит понимали. Попробовал сначала ими поработать, выдать из процедуры лог на русском, дак в mc ни имя файла(русское), ни сам текст в нём не отображались корректно. В то время как firebird настроен на win1251.
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39553378
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжекВ то время как firebird настроен на win1251
в смысле конкретная база...
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39553436
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжекДа нет, я уже протестировал - работает.

Тебе сугубо повезло, что глобальная локаль на твоём линухе как раз UTF-8.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39553446
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно, можно было и функциями fn_fopen, fn_fwrite воспользваться, а потом у bashа выбрать кодировку win1251 и из него уже mc запустить для просмотра этих файлов...
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39553450
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...но и для fn_fopen, fn_fwrite всё равно пришлось rfunc пересобирать - они по умолчанию не включаются в сборку...
...
Рейтинг: 0 / 0
Не открывается файл UTF-8
    #39553556
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжекНаверно, можно было и функциями fn_fopen, fn_fwrite воспользваться, а потом у bashа выбрать кодировку win1251 и из него уже mc запустить для просмотра этих файлов...
Так не получается - mc открывается с крокозяблами...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не открывается файл UTF-8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]