Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не открывается файл UTF-8 / 10 сообщений из 10, страница 1 из 1
14.11.2017, 16:19
    #39552952
Джек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не открывается файл UTF-8
Добрый день всем!
Пишу на простом 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
14.11.2017, 16:35
    #39552961
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не открывается файл UTF-8
Джек
Код: sql
1.
2.
*out++='\r';
*out++='\n';


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

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

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


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