Page 5 of 9

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:13 pm
by Serge
CleverMouse
mingw gcc utf8 не умеет. L"" строки кодируются в utf16.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:25 pm
by CleverMouse
А просто "строка в UTF-8", если файл закодирован в UTF-8? Ему не пофиг, что там внутри кавычек?

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:41 pm
by Serge
Ему не пофиг, что там внутри кавычек?
Не совсем. Но всё решаемо. По умолчанию gcc ожидает UTF-8. Если это не utf8 нужен ключ. Например для L"Привет мир" ключ -finput-charset=CP1251, если файл в Win кодировке для кириллицы.
-fwide-exec-charset=charset установит во что будут перекодированы L"" строки.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:43 pm
by CleverMouse
А зачем вообще использовать L"...", если для UTF-8 речь идёт о просто "..."?

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:43 pm
by Serge
Мне не нравится UTF-8 тем, что это кодировка с переменной длиной символа. Любая операция со строками сильно усложняется. Лучше сразу UTF-32.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:45 pm
by Serge
CleverMouse wrote:А зачем вообще использовать L"...", если для UTF-8 речь идёт о просто "..."?
А скомпилируется, если символы не влезают в char ?
Я в этом сомневаюсь.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:54 pm
by CleverMouse
Консоль mingw64 под виндой: всё в UTF-8

Code: Select all

$ cat 1.c
#include <stdio.h>

int main()
{
        static const char str[] = "Здравствуй, мир!";
        FILE* f = fopen("qq.txt", "wb");
        if (f) {
                fwrite(str, sizeof(str), 1, f);
                fclose(f);
        }
        return 0;
}
$ gcc 1.c && ./a
$ cat qq.txt
Здравствуй, мир!
Все файлы - в UTF-8.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 7:57 pm
by CleverMouse
А UTF-16 - кодировка с длиной символа, которая иногда переменная. Это ещё хуже.
UTF-32 - вещь в принципе хорошая, но с ней мало кто умеет работать. Скопировать набор байт от одной кавычки до другой из исходника в бинарник могут более-менее все компиляторы, а вот перегонять туда-сюда - удовольствия мало.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 8:14 pm
by Serge
Проверил, получается так:
обычная строка "" конвертируется в -fexec-charset=utf-8
L"" строка в -fwide-exec-charset=utf-16

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 8:20 pm
by CleverMouse
Я попробовала пересохранить вышеупомянутый 1.c в cp1251 и в cp866. gcc молча проглотил оба варианта, qq.txt соответственно оказался в cp1251 и в cp866.

Code: Select all

$ gcc --version
gcc.exe (Rev2, Built by MSYS2 project) 6.2.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 8:29 pm
by Siemargl
CleverMouse wrote:Я предлагаю считать, что для PE-приложений абсолютно всё в UTF-8 без всяких маркеров - вход/выход системных функций 2,4,70,что-у-нас-там-ещё-принимает-строки, argv[0], все библиотеки. Иначе откуда, скажем, box_lib может узнать, хочет приложение строку в cp866 или в utf-8? Делать флаги для всех-всех-всех библиотек - означает дикие метастазы legacy по всей системе.
В бокс-либ есть битик для этого в цвете. Он передается функции 4 обычно без изменений.

Конечно, расчеты ширины поплывут, но это можно обработать специально - все равно переделывать т.к.многие ширину не считают вообще.
Я за 866 по умолчанию, или другой однобайтовой кодировки, которая в установлена в системе по умолчанию.

Все поломать и переписать в UTF8 ради кого? Кому нужна эта универсальность ?

Начинать по любому надо с поддержки конверсий ядром или системной библиотекой. А то в newlib своя трансляция, в файловых система своя, в функциях вывода на экран - хз, тоже отдельная?
Кто сказал что они совпадают?

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 8:55 pm
by Serge
CleverMouse wrote:Я попробовала пересохранить вышеупомянутый 1.c в cp1251 и в cp866. gcc молча проглотил оба варианта, qq.txt соответственно оказался в cp1251 и в cp866.
У меня не получалось
error: converting to execution character set: Illegal byte sequence
wprintf(L"%S",L"Hello World UTF-16! Привет мир\n");

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 8:56 pm
by CleverMouse
Ещё раз, а L""-то зачем? Почему не обычный printf с UTF-8?

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 9:13 pm
by Serge
CleverMouse wrote:Ещё раз, а L""-то зачем? Почему не обычный printf с UTF-8?
Обычный printf UTF-8 не понимает. Здесь wprintf нужен.

Re: C-- Sphinx Compiler

Posted: Thu Nov 17, 2016 9:14 pm
by hidnplayr
Siemargl wrote: Все поломать и переписать в UTF8 ради кого? Кому нужна эта универсальность ?
How about everybody who does not use CP866 or CP1251?