CleverMouse
mingw gcc utf8 не умеет. L"" строки кодируются в utf16.
C-- Sphinx Compiler
А просто "строка в UTF-8", если файл закодирован в UTF-8? Ему не пофиг, что там внутри кавычек?
Сделаем мир лучше!
Не совсем. Но всё решаемо. По умолчанию gcc ожидает UTF-8. Если это не utf8 нужен ключ. Например для L"Привет мир" ключ -finput-charset=CP1251, если файл в Win кодировке для кириллицы.Ему не пофиг, что там внутри кавычек?
-fwide-exec-charset=charset установит во что будут перекодированы L"" строки.
А зачем вообще использовать L"...", если для UTF-8 речь идёт о просто "..."?
Сделаем мир лучше!
Мне не нравится UTF-8 тем, что это кодировка с переменной длиной символа. Любая операция со строками сильно усложняется. Лучше сразу UTF-32.
А скомпилируется, если символы не влезают в char ?CleverMouse wrote:А зачем вообще использовать L"...", если для UTF-8 речь идёт о просто "..."?
Я в этом сомневаюсь.
Консоль mingw64 под виндой: всё в UTF-8
Все файлы - в 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-16 - кодировка с длиной символа, которая иногда переменная. Это ещё хуже.
UTF-32 - вещь в принципе хорошая, но с ней мало кто умеет работать. Скопировать набор байт от одной кавычки до другой из исходника в бинарник могут более-менее все компиляторы, а вот перегонять туда-сюда - удовольствия мало.
UTF-32 - вещь в принципе хорошая, но с ней мало кто умеет работать. Скопировать набор байт от одной кавычки до другой из исходника в бинарник могут более-менее все компиляторы, а вот перегонять туда-сюда - удовольствия мало.
Сделаем мир лучше!
Проверил, получается так:
обычная строка "" конвертируется в -fexec-charset=utf-8
L"" строка в -fwide-exec-charset=utf-16
обычная строка "" конвертируется в -fexec-charset=utf-8
L"" строка в -fwide-exec-charset=utf-16
Я попробовала пересохранить вышеупомянутый 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.
Сделаем мир лучше!
В бокс-либ есть битик для этого в цвете. Он передается функции 4 обычно без изменений.CleverMouse wrote:Я предлагаю считать, что для PE-приложений абсолютно всё в UTF-8 без всяких маркеров - вход/выход системных функций 2,4,70,что-у-нас-там-ещё-принимает-строки, argv[0], все библиотеки. Иначе откуда, скажем, box_lib может узнать, хочет приложение строку в cp866 или в utf-8? Делать флаги для всех-всех-всех библиотек - означает дикие метастазы legacy по всей системе.
Конечно, расчеты ширины поплывут, но это можно обработать специально - все равно переделывать т.к.многие ширину не считают вообще.
Я за 866 по умолчанию, или другой однобайтовой кодировки, которая в установлена в системе по умолчанию.
Все поломать и переписать в UTF8 ради кого? Кому нужна эта универсальность ?
Начинать по любому надо с поддержки конверсий ядром или системной библиотекой. А то в newlib своя трансляция, в файловых система своя, в функциях вывода на экран - хз, тоже отдельная?
Кто сказал что они совпадают?
У меня не получалось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");
Ещё раз, а L""-то зачем? Почему не обычный printf с UTF-8?
Сделаем мир лучше!
Обычный printf UTF-8 не понимает. Здесь wprintf нужен.CleverMouse wrote:Ещё раз, а L""-то зачем? Почему не обычный printf с UTF-8?
How about everybody who does not use CP866 or CP1251?Siemargl wrote: Все поломать и переписать в UTF8 ради кого? Кому нужна эта универсальность ?
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
Who is online
Users browsing this forum: No registered users and 6 guests