Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
1

Вывод символов из таблицы символов

26.12.2015, 19:35. Показов 2703. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
хочу распечатать символы из кодовой страницы и...
Подскажите, пожалуйста, почему не печатаются символы и как их вообще распечатать?
код из VS2012

C++
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
28
29
#include "stdafx.h"
#include <iostream>
#include <locale>
 
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
    
system("chcp"); // для Windows
 
    locale loc = locale("");
    locale::global(loc);
  // используем новую глобальную локаль для последующего вывода широких символов
    wcout.imbue(loc);
 
    wcout << "Установлена локаль: "<< loc.name().c_str() << endl;
    wcout << "Манимальный номер символа потока wchar  " << WCHAR_MIN << endl;
    wcout << "Максимальный номер символа потока wchar  " << WCHAR_MAX << endl;
    
// Собственно здесь, по-моему, должно печаться
for (wchar_t i=WCHAR_MIN+1000; i>WCHAR_MAX-1000; i++)
    {
        wcout << "char["<< i << "]="<< putwchar (i) << '\t';
    }
cout << "\a";
system("pause"); 
    
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2015, 19:35
Ответы с готовыми решениями:

Вывод таблицы из символов
Необходимо вывести таюблицу из n-строк, имеющую такой вид: Есть код, но он содержит ошибки:...

Как настроить ввод русских символов и в дальнейшем вывод этих символов
Подскажите как в этом коде настроить ввод русских символов и в дальнейшем вывод этих символов....

Вывод знака в консоль из таблицы символов Windows (charmap)
Подскажите пожалуйста как вывести математический знак умножения (точка) из таблицы символов? У нее...

Цикл While, вывод таблицы символов и соответствующих им целых чисел
Всем доброго времени суток!!! Ситуация следующая... Задача: Символ 'b' равен char('a' + 1), 'c' -...

16
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
26.12.2015, 20:16 2
putwchar() - функция. Зачем ты её в wcout ставишь? И почему диапазон у цикла именно такой?
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
26.12.2015, 20:32  [ТС] 3
да, с putwchar(i) я уж и сам догнал - она ведь int возвращает
и переделал так (работает):

C++
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
28
29
30
#include "stdafx.h"
#include <iostream>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    system("chcp");
 
    std::locale loc = std::locale("");
    std::locale::global(loc);
    std::cout.imbue(loc);
 
    std::cout << "Установлена локаль: "<< loc.name().c_str() << std::endl;
    std::cout << "Манимальный номер символа потока char  " << CHAR_MIN << std::endl;
    std::cout << "Максимальный номер символа потока char  " << CHAR_MAX << std::endl;
 
 
    std::cout << "Выводим таблицу символов: \n \n";
    for(char i=CHAR_MIN; i<CHAR_MAX;i++)
    {
    std::cout << "char["<< (int)i << "]=";
    std::putchar (i); 
    std::cout << '\t';
    if (i%3 == 0)   {std::cout <<  '\n';}
    else    {std::cout << '\t';}
    }
    std::cout << '\n';
    system("pause");
    return 0;
}
хотел посмотреть wchar_t что за зверь, ведь расширенный тип... ))
диапазон пляшет от констант WCHAR_MIN и WCHAR_MAX, по 1000 с каждого конца так просто обрезал
а как UTF какой-нибудь распечатать? долго правда, но хоть диапазон?
я так, упражняюсь - решил работу со строками и символами освоить, вот и "кручу" так, да этак
че-т с локалями не въезжаю, с фасетами тоже...
wchar_t - какой-то дефектный тип получается? ))
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.12.2015, 21:25 4
https://ru.wikipedia.org/wiki/UTF-8
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
26.12.2015, 22:57 5
Что значит распечатать utf? wchar_t и есть utf. Чем он дефектный?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
26.12.2015, 23:00 6
Цитата Сообщение от nmcf Посмотреть сообщение
wchar_t и есть utf
это с каких таких пор? unicode != utf
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
26.12.2015, 23:03 7
KOPOJI, в данном случае равен. wchar_t - utf16.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
27.12.2015, 00:00  [ТС] 8
короче, все смешалось в доме Облоских - люди, кони ))

nmcf,
Что значит распечатать utf? wchar_t и есть utf. Чем он дефектный?
Имелось в виду, что подобный код ничего не выводил
C++
1
2
3
4
5
6
7
8
9
std::cout << "Выводим таблицу символов: \n \n";
    for(char i=WCHAR_MIN; i<WCHAR_MAX;i++)
    {
    std::wcout << "wchar["<< (int)i << "]=";
    std::putwchar (i); 
    std::wcout << '\t';
    if (i%3 == 0)   {std::wcout <<  '\n';}
    else    {std::wcout << '\t';}
    }
надо локаль с расширенным набором символов установить типа "ru_RU.utf8"?

еще вопрос: почему
C++
1
2
3
setlocal (LC_ALL, "Rus");
time_t result = time(NULL);
    cout << asctime(localtime(&result))<< '\n';
выводит:
Sun Dec 27 и тд
почему по-русски не пишет? вроде же LC_ALL должно все переводить на русские рельсы?

и так пробую
C++
1
2
std::setlocale(LC_ALL, "ru_RU.UTF-8");
std::setlocale(LC_TIME, "ru_RU");
тоже самое...
C++
1
2
3
std::locale loc = std::locale("");
std::cout << "Установлена локаль: "<< loc.name().c_str() << std::endl;//пишет Russian_Russia.1251
std::setlocale(LC_ALL, loc.name().c_str());
тоже самое...
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
27.12.2015, 02:16 9
SergioO, Подскажите, как вывести знак фунта в консоли - перепробовал кучу способов, ничего не получается

C++
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
#include "stdafx.h"
#include <iostream>
#include <wchar.h>
#include <io.h>
#include <fcntl.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    _setmode(_fileno(stdout), _O_U16TEXT);
 
    using namespace std;
 
    wcout << L"Манимальный номер символа потока wchar  " << WCHAR_MIN << endl;
    wcout << L"Максимальный номер символа потока wchar  " << WCHAR_MAX << endl;
 
    wchar_t c = WCHAR_MIN + 1050;
    for (wchar_t i = c; i < c + 100; i++)
    {
        wcout << L"char[" << i << L"]=" << i << L'\t';
    }
    wcout << L"\a";
    system("pause");
 
    return 0;
}
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
27.12.2015, 10:52  [ТС] 10
Можно тогда сразу несколько вопросов:
#include "stdafx.h"
#include <iostream>
#include <wchar.h>
#include <io.h>
#include <fcntl.h>
это что?
C++
1
_setmode(_fileno(stdout), _O_U16TEXT);
и это что?
смотрим в стандарт С++ 14
C++ headers for C library facilities
<cassert> <cinttypes> <csignal> <cstdio> <cwchar>
<ccomplex> <ciso646> <cstdalign> <cstdlib> <cwctype>
<cctype> <climits> <cstdarg> <cstring>
<cerrno> <clocale> <cstdbool> <ctgmath>
<cfenv> <cmath> <cstddef> <ctime>
<cfloat> <csetjmp> <cstdint> <cuchar>
что используя ниже перечисленное, а лучше чисто плюсовое
C++ library headers
<algorithm> <fstream> <list> <regex> <tuple>
<array> <functional> <locale> <scoped_allocator> <type_traits>
<atomic> <future> <map> <set> <typeindex>
<bitset> <initializer_list> <memory> <sstream> <typeinfo>
<chrono> <iomanip> <mutex> <stack> <unordered_map>
<codecvt> <ios> <new> <stdexcept> <unordered_set>
<complex> <iosfwd> <numeric> <streambuf> <utility>
<condition_variable> <iostream> <ostream> <string> <valarray>
<deque> <istream> <queue> <strstream> <vector>
<exception> <iterator> <random> <system_error>
<forward_list> <limits> <ratio> <thread>
есть же <locale> или, на край, <clocale>

Демонстрирует типичный (кросс-платформенный) пролог локале-зависимой программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <locale>
 
int main()
{
    std::wcout << "Предпочитаемые пользователем настройки локали: " << std::locale("").name().c_str() << '\n';
    // при старте программы глобальная локаль установлена в локаль "C"
    std::wcout << 1000.01 << '\n';
    // заменяем глобальную локаль C++ (вместе с локалью C) на предпочитаемую пользователем локаль
    std::locale::global(std::locale("") );
    // используем новую глобальную локаль для последующего вывода широких символов
    std::wcout.imbue(std::locale());
    // снова выводим некоторое число
    std::wcout << 1000.01 << '\n';
}
и
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstdio>
#include <clocale>
#include <ctime>
#include <cwchar>
 
int main()
{
    // the C locale will be UTF-8 enabled English;
    // decimal dot will be German
    // date and time formatting will be Japanese
    std::setlocale(LC_ALL, "en_US.UTF-8");
    std::setlocale(LC_NUMERIC, "de_DE");
    std::setlocale(LC_TIME, "ja_JP");
 
    wchar_t str[100];
    std::time_t t = std::time(NULL);
    std::wcsftime(str, 100, L"%A %c", std::localtime(&t));
    std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
}
нельзя ли как-то "по-человечески" UTF какой мне надо только русский поставить?
просто используя вышеприведенные примеры дата выводится в английском формате...
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
27.12.2015, 11:04 11
Лучший ответ Сообщение было отмечено SergioO как решение

Решение

Это нестандартная функция Visual C++, которая переключает windows-консоль в режим utf16.
C++
1
_setmode(_fileno(stdout), _O_U16TEXT);
По умолчанию она в древних кодировках работает.

Добавлено через 6 минут
Вот так выводит по-русски:
C++
1
2
3
4
5
    locale::global(locale(""));
    wchar_t str[100];
    std::time_t t = std::time(NULL);
    std::wcsftime(str, 100, L"%A %c", std::localtime(&t));
    std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
1
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
27.12.2015, 11:51  [ТС] 12
Цитата Сообщение от nmcf Посмотреть сообщение
C++Выделить код
* * locale::global(locale(""));
* * wchar_t str[100];
* * std::time_t t = std::time(NULL);
* * std::wcsftime(str, 100, L"%A %c", std::localtime(&t));
* * std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
а можно эти несклько строк подробно прокомментировать, те указать заголовочные файлы необходимые и что выполняет? особо интересует вот это
C++
1
locale::global(locale(""));
и почему у меня не получалось?
вроде ж wcout использовал... надо еще было L указывать?
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
27.12.2015, 13:04 13
Это же твой пример. И эта строчка у тебя выше была:
C++
1
locale::global(locale(""));
Устанавливает текущую системную локаль вместо "C".
<locale>, <cwchar>, <ctime>.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
27.12.2015, 14:43  [ТС] 14
Цитата Сообщение от nmcf Посмотреть сообщение
Это же твой пример. И эта строчка у тебя выше была:
C++Выделить код
1
locale::global(locale(""));
Устанавливает текущую системную локаль вместо "C".
<locale>, <cwchar>, <ctime>.
ну уж таки и мой пример ) копирую из руководства и разбираюсь. просто символы и строки разбираю и чего-то с локалями "засел"
устанавливает куда? и что такое "С"?

что нужно подставить в строку чтобы работал код?
C++
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
28
#include "stdafx.h"
#include <iostream>
#include <locale>
#include <codecvt>
#include <exception>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    try 
    {
    std::locale l1;  // l1 - копия классической локали "C"
    std::locale l2("ru_RU.UTF8"); // l2 - юникодная локаль -чего сюда подставить, чтобы работало? какие локали доступны?
    std::locale l3(l1, l2, std::locale::ctype); // l3 - локаль "C" для всего, за исключением фасетов ctype, которые юникодные
    std::locale l4(l1, new std::codecvt_utf8<wchar_t>); // l4 - локаль "C" для всего, за исключением фасета codecvt
    std::cout << "Имена локалей:\nl1: " << l1.name()
    << "\nl2: " << l2.name()
               << "\nl3: " << l3.name() << "\nl4: " << l4.name() << '\n';
    }
    catch (std::runtime_error err)
    {
    std::cerr << err.what() << std::endl;
    }
    
    system("pause");
        return 0;
}
я пытаюсь подставлять
"ru_RU.UTF8", "ru_RU.CP1251", но получаю ошибку...
как вывести в консоль список доступных локалей?
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
27.12.2015, 15:00 15
Проблема в том, что написанное в книжке не совпадает с реальностью. Когда читаешь про локали, кажется, что всё просто - установил нужную и готово. На самом деле, по крайней мере в Windows, эти функции почему-то не увязаны с работой консоли и не меняется шрифт. Например, когда ты выбираешь utf8, не происходит автоматического переключения консоли в этот режим. Нужно либо ту самую нестандартную функцию использовать, либо WinAPI.
Возможно, в Linux это работает лучше, я не проверял.

Добавлено через 48 секунд
Цитата Сообщение от SergioO Посмотреть сообщение
что такое "С"
Это локаль по умолчанию. Только английский алфавит и американские настройки.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
27.12.2015, 15:48  [ТС] 16
nmcf, задал вопрос на форуме MS. Интересно чего ответят.
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
27.12.2015, 17:23 17
По-английски? Ответят, что не поддерживается.
0
27.12.2015, 17:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2015, 17:23
Помогаю со студенческими работами здесь

Введите массив символов из 12 элементов. Удвоить все коды символов массива
Условие :Введите массив символов из 12 элементов. Удвоить все коды символов массива. Заранее...

Дана строка символов. Подсчитать общее число вхождений символов .,+ в строку
Здравствуйте. Дана строка символов. Подсчитать общее число вхождений символов .,+ в строку. Как...

Найти количество символов в самой длинной цепочке из одинаковых символов
Дана строка символов St длиной не более 72, которая может состоять из цифр, малых латинских букв и...

В строке символов найти максимальную подпоследовательность символов, являющуюся палиндромом
Народ, помогите пожалуйста. Нужно написать программу, используя динамический массив. Вот условие...


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

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