Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,406

DevCpp MinGW Широкие строки

03.02.2020, 20:03. Показов 1572. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Вот код.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <locale>
 
int main(int argc, char** argv)
{
    std::wcout.imbue(std::locale("rus_rus.1251"));
    std::wcout << L"Всем привет!\n";
    return 0;
}
Без строки "Всем привет!\n" компилируется, но выходит с кодом 3 - оказалась причина в std::locale, но что именно с ним не так?
Со строкой "Всем привет!\n" не компилируется если есть L, а как без него писать?
Как исправить код?
Спасибо за ответы!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2020, 20:03
Ответы с готовыми решениями:

Что такое "широкие" и "узкие" С-строки
Гуглила, и не нашла более-менее нормального ответа на вопрос: &quot;Что же такое &quot;широкие&quot; и &quot;узкие&quot; С-строки. Если приведете...

Может ли MinGW x64 компилить приложения x32? Или нужно для этого отдельно ещё MinGW х32 качать?
Просто решил поиграться с CodeLite.

Mingw-w64 MinGW TDM-GCC
Всем привет. Хочу понять, существует ли принципиальная разница между Mingw-w64, MinGW и TDM-GCC? Какие плюсы/минусы у этих трех...

8
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
03.02.2020, 23:37
Цитата Сообщение от SomniPhobia Посмотреть сообщение
выходит с кодом 3 - оказалась причина в std::locale, но что именно с ним не так?
Нет локали с таким именем: rus_rus.1251
По этому поводу вылетает исключение, которое вы не ловите. Поэтому программа выходит с кодом 3.

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Со строкой "Всем привет!\n" не компилируется если есть L, а как без него писать?
Как именно не компилируется?
Подозреваю, что кодировка файла исходника не UTF-8. В MinGW по умолчанию для конвертации в UTF-16 используется именно она.

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Как исправить код?
По-нормальному - никак. В MinGW не доделаны локали, и не поддерживается нативный UTF-16 вывод через stdout, по причине использования legacy рантайма msvcrt.

Можно пойти в обход и написать свой streambuffer, который будет использовать API-шные функции WriteConsole b подменить им стандартный. Где-то на форуме я публиковал прототип.
1
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,898
04.02.2020, 09:54
Цитата Сообщение от DrOffset Посмотреть сообщение
По-нормальному - никак.
На счет виндовой версии не знаю, но в кросспомпиляторе можно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#ifdef WIN32
  #include <windows.h>
  #include "fcntl.h"
  __attribute__((constructor)) void coninit(){
    SetConsoleCP(CP_UTF8); SetConsoleOutputCP(CP_UTF8);
    _setmode(_fileno(stdout), _O_U8TEXT);
    _setmode(_fileno(stdin), _O_U8TEXT);
  }
#endif
  
int main(){
  setlocale(LC_ALL, "");
  wprintf(L"x\u00B2+7x+4\n");
  return 0;
}
Code
1
2
3
4
5
6
$ gcc main.c
$ ./a.out 
x²+7x+4
$ i686-w64-mingw32-gcc main.c
$ wine a.exe 
x²+7x+4
Естественно, работу экзешника проверял не только в wine, но и на виртуальной машине.
2
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
04.02.2020, 19:20
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
На счет виндовой версии не знаю
Да, в последней версии MSYS2 тоже работает. Похоже с 2016 года кое-что изменилось
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,406
04.02.2020, 19:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет локали с таким именем: rus_rus.1251
И локали с именами "rus_rus.866" и ".866" не подходят: тоже выход с кодом 3.
Цитата Сообщение от DrOffset Посмотреть сообщение
По этому поводу вылетает исключение, которое вы не ловите. Поэтому программа выходит с кодом 3.
C++
1
2
3
4
5
6
7
8
try
{
    std::wcout.imbue(std::locale("rus_rus.1251"));
}
catch(std::exception& e)
{
        std::cout << e.what() << "\n";
}
locale::facet::_S_create_c_locale name not valid
А какие тогда есть локали? В Microsoft компиляторе есть такие локали "rus_rus.866" и "rus_rus.1251", как я помню. В MinGW значит нет?
Цитата Сообщение от DrOffset Посмотреть сообщение
Как именно не компилируется?
[Error] converting to execution character set: Illegal byte sequence
Цитата Сообщение от DrOffset Посмотреть сообщение
Подозреваю, что кодировка файла исходника не UTF-8. В MinGW по умолчанию для конвертации в UTF-16 используется именно она.
Кодировка main.cpp Windows (CR LF). Что это за кодировка, у неё есть номер?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
04.02.2020, 19:36
Цитата Сообщение от SomniPhobia Посмотреть сообщение
В Microsoft компиляторе есть такие локали "rus_rus.866" и "rus_rus.1251", как я помню. В MinGW значит нет?
Да, в MinGW нет.

Цитата Сообщение от SomniPhobia Посмотреть сообщение
[Error] converting to execution character set: Illegal byte sequence
Это как раз то, о чем я говорил.
Возьмите какой-нибудь Notepad++ и сохраните файл в UTF-8.
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,406
04.02.2020, 19:44  [ТС]
DrOffset,
C++
1
2
3
setlocale(LC_ALL, ".1251");
//и
SetConsoleOutputCP(1251);
Способствуют нормальному отображению русского текста в консоле. Значит файл исходного кода в 1251.

Добавлено через 5 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Возьмите какой-нибудь Notepad++ и сохраните файл в UTF-8.
В файле что были символы кириллицы испортились. Я переписал текст уже после перекодирования. Всё равно также [Error] converting to execution character set: Illegal byte sequence если писать L перед литералом.
Без L вот так
C++
1
2
setlocale(LC_ALL, ".1251");
std::wcout << "Привет!\n";
Нормально стало выводить в консоль. Почему L не понадобилось, из-за UTF-8?

Добавлено через 2 минуты
C++
1
2
setlocale(LC_ALL, ".866");
std::wcout << "Привет!\n";
И так тоже правильно выводится в консоль.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
04.02.2020, 19:47
SomniPhobia, если хотите использовать широкие строки в MinGW, файл исходника должен быть в UTF-8. Или вы должны явно указать компилятору в какой кодировке у вас файлы, чтобы он смог выполнить преобразование в UTF-16.
Явно указать, что например у вас 1251, можно с помощью ключа -finput-charset=CP1251

Добавлено через 57 секунд
Цитата Сообщение от SomniPhobia Посмотреть сообщение
В файле что были символы кириллицы испортились.
Значит вы что-то неправильно делаете.

Добавлено через 1 минуту
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Всё равно также [Error] converting to execution character set: Illegal byte sequence если писать L перед литералом.
Значит там не UTF-8 на самом деле. При неумелой конвертации может получиться смесь двух кодировок в одном файле. Это же может причиной того, что "символы испортились", т.к. редактор не может корректно опознать кодировку из-за наличия смеси.
1
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,898
05.02.2020, 10:34
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, в последней версии MSYS2 тоже работает. Похоже с 2016 года кое-что изменилось
Не факт. Возможно, дело в том магическом конструкторе, которые переключает все в странные режимы. Как его можно написать "с нуля по мануалу" я без понятия: этот вариант писался методом тыка.
Кстати, я тут обнаружил, что Dev-CPP не умеет работать с исходниками в UTF-8. Может, его можно как-то научить? Или просто существуют другие IDE под винду? Мне-то, само собой это не слишком нужно, но надо же что-то советовать новичкам.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2020, 10:34
Помогаю со студенческими работами здесь

Широкие строки в консоли Windows 7 неправильно обрабатываются
Здравствуйте, не подскажет ли кто как правильно работать с широкими строками в консоли Windows 7? То есть выводить на экран и вводить...

MinGW, при установке ошибка: unpacking mingw-get-0.6.2-mingw32-beta-20131004-1-bin.tar.xz
Добрый день, форумчане! Недавно начал изучать Си, решил попрактиковаться. В качестве компилятора не знал какой выбрать (вообще не знаю,...

Широкие дисплеи
Абсолютно не понимаю, зачем такие нужны. Всё равно, ведь на дополнительной площади показывать обычно нечего. Вот если бы выпускались...

Широкие символы + Unicode
Доброго времени суток всем) На эту тему материала много, но он весь разрозненный и не полный. Хотелось бы всё узнать о представлении...

Широкие символы в Code Blocks
Code Blocks 13.12, mingw 4.7.1, почему не проходит компиляция такого кода? #include &lt;iostream&gt; using namespace std; int main() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru