Page 5 of 10
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?