Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 26

Кириллица и wcout

27.10.2019, 18:48. Показов 7501. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!
столкнулся с проблемой, что если перед wcout использовать cout, то портится вывод текста в консоль:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main( void ) 
    {                   
 
    setlocale(LC_ALL,"");
 
    std::wstring str = L"Привет мир";
 
 
    //std::cout << "TEST"<< std::endl;  // если это раскомментировать,
                                    // то следующая строка выводит кракозябры
        
    std::wcout << str << std::endl;
 
}

игрался с разными параметрами setlocale(LC_ALL,"")

ОС убунта линукс, локаль ru_RU.utf8
компилятор g++
исходник в utf8
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.10.2019, 18:48
Ответы с готовыми решениями:

Подсчитать количество вхождений буквы (кириллица) в строку (кириллица)
Суть такая: по требованию программы ввести строку символов (обыкновенный текст, кириллица(!!!)) и посчитать количество вхождений, если...

Использование wcout
В чем ошибка? Компиляция прошла без проблем. В командной строке пишет просто &quot;Для продолжения нажмите любую клавишу...&quot;. ...

Std::wcout не выводит сообщение
Здравствуйте. Вот в таком коде : int _tmain(int argc, _TCHAR* argv) { std::vector&lt;std::string&gt; Directories; //...

7
Заблокирован
09.04.2020, 16:51
Цитата Сообщение от ctrong Посмотреть сообщение
Приветствую!
столкнулся с проблемой, что если перед wcout использовать cout, то портится вывод текста в консоль:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main( void ) 
    {                   
 
    setlocale(LC_ALL,"");
 
    std::wstring str = L"Привет мир";
 
 
    //std::cout << "TEST"<< std::endl;  // если это раскомментировать,
                                    // то следующая строка выводит кракозябры
        
    std::wcout << str << std::endl;
 
}

игрался с разными параметрами setlocale(LC_ALL,"")

ОС убунта линукс, локаль ru_RU.utf8
компилятор g++
исходник в utf8
Братец, cout это базовый поток вывода в C++, а установка локали setlocale - это оператор чистого базового языка Си, в котором "широкие" строки изначально не применялись и для обработки языков, отличных от латиницы, ввели тип wchar_t и оператор вывода wprint.
Если в локали все прописано верно, то под Linux вывод будет верный. Чтобы проверить свою текущую настроенную локаль, то после оператора setlocale(LC_ALL, "rus") выведи через cout итог установки твоей локали оператором - cout<<setlocale(LC_ALL, NULL) . Увидишь, поставил ли русскую локаль или все-таки нет. Если будет ответ в консоли типа "C", то ни фига не поставил и текущая локаль - латиница языка Си.
В C++ Linux проблем с локалью нет, так как по умолчанию используется язык твоей операционки и utf8 рулит.
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
09.04.2020, 20:04
Цитата Сообщение от tester_me Посмотреть сообщение
В C++ Linux проблем с локалью нет, так как по умолчанию используется язык твоей операционки
Чушь. Пруфов, так понимаю, не будет? Ок, вот опровержение (источник):
On program startup, the locale selected is the "C" locale, which is the same as would be set by calling setlocale(LC_ALL,"C").
Цитата Сообщение от ctrong Посмотреть сообщение
если перед wcout использовать cout, то портится вывод текста в консоль
Это нормально. Необходимо определиться: либо cout, либо wcout, но не смешивать. Подробнее см. std::wcout.
A program should not mix output operations on wcout with output operations on cout (or with other narrow-oriented output operations on stdout): Once an output operation has been performed on either, the standard output stream acquires an orientation (either narrow or wide) that can only be safely changed by calling freopen on stdout.
0
Заблокирован
17.04.2020, 12:21
Цитата Сообщение от ctrong Посмотреть сообщение
Приветствую!
столкнулся с проблемой, что если перед wcout использовать cout, то портится вывод текста в консоль:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main( void ) 
    {                   
 
    setlocale(LC_ALL,"");
 
    std::wstring str = L"Привет мир";
 
 
    //std::cout << "TEST"<< std::endl;  // если это раскомментировать,
                                    // то следующая строка выводит кракозябры
        
    std::wcout << str << std::endl;
 
}

игрался с разными параметрами setlocale(LC_ALL,"")

ОС убунта линукс, локаль ru_RU.utf8
компилятор g++
исходник в utf8
Раскоменть все строки, потом:
4-ю строку переделай на : std::wcout<<setlocale(LC_ALL,"")<<endl; тогда у тебя выведется твой "Привет мир" (локаль в wcout пойдет выводить)

а если 4-й строку переделаешь на: std::cout<<setlocale(LC_ALL,"")<<endl; - тогда у тебя выведется твой TEST(локаль в cout пойдет).

Элементарно, Ватсон, в Линуксе все потоки в основном простейшие в виде обычного файла. Представь, что ты пытаешься запихать в один и тот же файл разноформатные строки, например, одну строку формата ASCII, а другую строку формата utf-8. Естественно, что система может запихать все до кучи, а выведет только то, что соответствует локали данного файла-потока.

Добавлено через 18 минут
Цитата Сообщение от valen10 Посмотреть сообщение
Чушь. Пруфов, так понимаю, не будет? Ок, вот опровержение (источник):



Это нормально. Необходимо определиться: либо cout, либо wcout, но не смешивать. Подробнее см. std::wcout.
Все верно толкуют, в С++ под Линукс проблем нет с локалью, так как ОС изначально заточена под однобайтовые и многобайтовые символы.
Если проверять локаль в коде С++, то можно проще, чем в Си, проверить текущую локаль с помощью оператора с пустыми ковычками: std::cout<<setlocale(LC_ALL,"")<<endl; - для вывода в стандартную консоль-файл
std::wcout<<setlocale(LC_ALL,"")<<endl; - для вывода "широких строк" в консоль-файл

И путать не надо божий дар с яичницей, сперва точно определитесь, какой файл вы компилируете: чисто Си-шный или C++, там есть разница в применении локалей и строк текста.

Зачем ссылаться на чьи-то комментарии и никем не проверенные тексты??? Ваши ссылки - вообще ни о чем, не доказательство.
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
17.04.2020, 12:49
Цитата Сообщение от Forum-Pomoyka Посмотреть сообщение
проверить текущую локаль с помощью оператора с пустыми ковычками: std::cout<<setlocale
Дальше не читал. Еще одна писанина от очередного диванного эксперта.
0
Заблокирован
17.04.2020, 13:02
Цитата Сообщение от valen10 Посмотреть сообщение
Дальше не читал. Еще одна писанина от очередного диванного эксперта.
Ну Ваши "тесты" по C++ ни о чем тоже не говорят ;-)
Если бы Вы на чистых Сях блеснули мозгом - тады ой, признаю боженьку)
А пока Вы - так, засланный для провокации казачок, чья задача - вступить в перепалку, спровоцировать,
пожаловаться, отсечь и заблокировать умного дядьку))) А то на фоне какого-то дядьки Ваш мозг прямо-таки
останется невостребованным в данном форуме)))
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
17.04.2020, 13:10
Цитата Сообщение от Forum-Pomoyka Посмотреть сообщение
умного дядьку
Умные дядьки функции операторами не называют и знают русский язык. Всё, "умный дядька", свободен, гуляй.
0
Заблокирован
17.04.2020, 15:31
Цитата Сообщение от valen10 Посмотреть сообщение
Умные дядьки функции операторами не называют и знают русский язык. Всё, "умный дядька", свободен, гуляй.
Сам прогуляйся, "знаток" русскАгА языка)))

Я так понял, ты тот самый "задира", который потом всех и блокирует))) Не стыдно так "подрабатывать"??? Мягко говоря, по-детски))) Лет сколько тебе??? Шишнадцать наверное??? )))

Добавлено через 1 час 54 минуты
Цитата Сообщение от valen10 Посмотреть сообщение
Умные дядьки функции операторами не называют и знают русский язык. Всё, "умный дядька", свободен, гуляй.
//// Для справки /////////////////////////////////////////////////////////////////////
Кто программировал(программирует) на самом низком уровне ассемблера, тот прекрасно знает, что на самом ДНЕ КОДА есть только Системные вызовы(то бишь функции) и Системные прерывания процессора. А то, что написал знаток кода, это последовательность текста, падающего словами и значения в регистры процессора. Падает номер функции в регистр - MOV или PUSH (с параметрами или операндами др. словами), падает оператор(команда) в регистр - снова MOV или PUSH (с параметрами или операндами). А если нужно запустить Системный вызов (прерывание) - это уже INT - отличается от всей писанины программиста))) Что "функция", что "оператор" программиста - все это одинаково для процессора - несколько манипуляций с регистрами. И простой оператор в тексте программы может быть более громоздким, чем функция.
Вот вам пример простенького вывода одной текстовой строки аналогами Ассемблера для 32-битного проца, посмотрите, что куда упало, когда вы написали всего один оператор где-нибудь в С++, типа Hello world":

Assembler
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
.data
msg:
  .ascii "Hello, world!\n"
  len = . - msg
.text
.globl _start
_start:
  mov   $4,   %eax
  mov   $1,   %ebx
  mov   $msg, %ecx
  mov   $len, %edx
  push  $write_ret
  push  %ecx
  push  %edx
  push  %ebp
  mov   %esp, %ebp
  sysenter
write_ret:
  mov   $1,   %eax
  xor   %ebx, %ebx
  push  $exit_ret
  push  %ecx
  push  %edx
  push  %ebp
  mov   %esp, %ebp
  sysenter
exit_ret:
Найдите, где "операторы", а где "функции" ))) Кто найдет, тому ПЛЮС в Пацанскую книжку)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.04.2020, 15:31
Помогаю со студенческими работами здесь

Wcout: Вывод непонятных символов
Всем доброго времени суток. Пишу прогу, которая вычленит из html-файла определенные тэги и выведет их в консоль. В блокноте все символы...

Cout и wcout. Русские буквы
Здравствуйте. При попытке считать из текстового файла, который содержит строку - &quot;Привет!&quot; - и вывести ее в консоль, первый...

wcout, wfstream в Code Blocks
Не пойму, почему компилятор не определяет wcout, wfstream. #include &lt;iostream&gt;, #include &lt;fstream&gt;, using namespace std; сделаны. В std,...

Часто ли вы пользуетесь wchar_t, wstring, wcout, wcin? Какие в них недостатки?
Сейчас в учебных целях нужно было для linux написать одну программу, работающую с кириллицей. Т.к. в консоли используется UTF-8, очень...

Error 1 error C2447: '{' : missing function header (old-style formal list?) и почему не работает ? и подскажите как пользоваться wcout
Всем привет я начинаю обучаться программированию и сегодня столкнулся с такой проблемой Error 1 error C2447: '{' : missing function header...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru