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

Кириллица и wcout

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

Author24 — интернет-сервис помощи студентам
Приветствую!
столкнулся с проблемой, что если перед 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2019, 18:48
Ответы с готовыми решениями:

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

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

Std::wcout не выводит сообщение
Здравствуйте. Вот в таком коде : int _tmain(int argc, _TCHAR* argv) {...

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

7
Заблокирован
09.04.2020, 16:51 2
Цитата Сообщение от 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
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
09.04.2020, 20:04 3
Цитата Сообщение от 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 4
Цитата Сообщение от 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
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
17.04.2020, 12:49 5
Цитата Сообщение от Forum-Pomoyka Посмотреть сообщение
проверить текущую локаль с помощью оператора с пустыми ковычками: std::cout<<setlocale
Дальше не читал. Еще одна писанина от очередного диванного эксперта.
0
Заблокирован
17.04.2020, 13:02 6
Цитата Сообщение от valen10 Посмотреть сообщение
Дальше не читал. Еще одна писанина от очередного диванного эксперта.
Ну Ваши "тесты" по C++ ни о чем тоже не говорят ;-)
Если бы Вы на чистых Сях блеснули мозгом - тады ой, признаю боженьку)
А пока Вы - так, засланный для провокации казачок, чья задача - вступить в перепалку, спровоцировать,
пожаловаться, отсечь и заблокировать умного дядьку))) А то на фоне какого-то дядьки Ваш мозг прямо-таки
останется невостребованным в данном форуме)))
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
17.04.2020, 13:10 7
Цитата Сообщение от Forum-Pomoyka Посмотреть сообщение
умного дядьку
Умные дядьки функции операторами не называют и знают русский язык. Всё, "умный дядька", свободен, гуляй.
0
Заблокирован
17.04.2020, 15:31 8
Цитата Сообщение от 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
17.04.2020, 15:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2020, 15:31
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru