Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/64: Рейтинг темы: голосов - 64, средняя оценка - 4.86
 Аватар для ivan_proger
3 / 3 / 2
Регистрация: 07.08.2018
Сообщений: 84

Вывод кириллических символов по их коду в Linux

13.04.2021, 13:02. Показов 12283. Ответов 12

Студворк — интернет-сервис помощи студентам
Добрый день!

Стоит следующая задача: рандомно генерировать коды кириллических букв (заглавных и строчных), а дальше выводить код буквы и саму букву. И всё это должно работать на Linux`е.

Хотел работать через коды ASCII, но после первых 128 символов идёт только "�". Помню, что для винды в кодировке 1251 кириллица располагается в кодах со 192 по 255 включительно. Для DOS коды другие. А вот какие коды для семейства систем Linux(дистрибутив Debian)?

Помимо этого на просторах рунета вычитал, что обычный char кодируется 1 байтом, когда кириллица требует целых два, поэтому она не вмещается в обычный char.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2021, 13:02
Ответы с готовыми решениями:

Не задаются множества, состоящие из кириллических символов (Linux)
Работаю с free pascal на линуксе. Собственно не задаются множества , состоящие из кириллистических символов . Например, const C = ;...

Корректный вывод кириллических символов
У меня есть бан лист для Minecraft(не мой, америкоса)! Как сделать чтобы он выводил русские буквы? Сам Код! <!DOCTYPE html> ...

Вывод кириллических символов в Bitmap
Создаю таблицу из 256 символов и рисую её в Bitmap. Да вот надо, чтобы после 127-го шёл русский набор символов. Шрифту ставлю чарсет...

12
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.04.2021, 14:41
Цитата Сообщение от ivan_proger Посмотреть сообщение
на просторах рунета вычитал, что обычный char кодируется 1 байтом, когда кириллица требует целых два, поэтому она не вмещается в обычный char.
почитай что такое unicode
0
 Аватар для ivan_proger
3 / 3 / 2
Регистрация: 07.08.2018
Сообщений: 84
13.04.2021, 15:03  [ТС]
hoggy, уже. Но не очень понимаю, как рандомно генерировать символы в юникоде.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.04.2021, 15:35
Цитата Сообщение от ivan_proger Посмотреть сообщение
как рандомно генерировать символы в юникоде.
в интернетах можно скачать уже готовую таблицу.
а потом просто рандомно по выбирать из этой таблицы любой произвольный код.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
13.04.2021, 15:42
Лучший ответ Сообщение было отмечено ivan_proger как решение

Решение

Цитата Сообщение от ivan_proger Посмотреть сообщение
в кодировке 1251
Забудьте этот атавизм
Если хотите работать с константными строками, без особой обработки, читайте про utf-8, но для вашей задачи лучше utf-32, он же wchar_t:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main(){
  setlocale(LC_ALL, "");
  for(wchar_t i=L'а'; i<=L'я'; i++){
    printf("%lc", i);
  }
  printf("\n");
}
1
 Аватар для ivan_proger
3 / 3 / 2
Регистрация: 07.08.2018
Сообщений: 84
13.04.2021, 21:53  [ТС]
COKPOWEHEU, спасибо! Не могу пока на практике "потыкать", доберусь до компа - детально изучу. Но вот пока такой вопрос. Можно ли вместо L'a' использовать static_cast<wchar_t>(???)? И если да, то какое целочисленное значение (именно его мне надо рандомно генерировать) подставлять?
0
Невнимательный
 Аватар для ft4l
2840 / 1266 / 358
Регистрация: 08.02.2013
Сообщений: 7,362
Записей в блоге: 2
13.04.2021, 23:28
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
wchar_t
Ввод-вывод с консоли идёт в utf-8
работать можно только как с байтами... в cygwin например если запусккаю
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <locale.h>
 
int main(void) {
    unsigned char buf[64], *r = buf;
    setlocale(LC_CTYPE, "ru_RU.UTF-8");//cygwin
    if (fgets(buf, 64, stdin)) {
        while (*r) printf("%02X ", *(r++));
    }
    return 0;
}
то видно zzz@zz ~
$ gcc -o ./test.exe ./test.c

zzz@zz ~
$ ./test.exe
Б S
D0 91 20 53 0A

русская буква 2 байта остальное по одному
Чтобы работать с wchar_t нужно сначала преобразовывать ввод в юникод
потом обратно для вывода
... но в wchar_t не все символы помещаются... которые помещаются в utf-8
3-х байтный юникод вроде кодируется в 4-х байтные utf-8
но 3-x вроде нет типов )) только как обрубки от long

Добавлено через 11 минут
Вроде в Perl utf8.h юзается

Добавлено через 28 минут
Оффициально юникод вроде где-то тут поддерживается
github.com/unicode-org/icu/releases/tag/release-69-1
но как-то многовато cpp файлов )
0
 Аватар для volodin661
6668 / 2260 / 346
Регистрация: 10.12.2013
Сообщений: 7,819
14.04.2021, 10:52
Цитата Сообщение от ivan_proger Посмотреть сообщение
Помимо этого на просторах рунета вычитал, что обычный char кодируется 1 байтом, когда кириллица требует целых два, поэтому она не вмещается в обычный char.
када америке придёт кирдык, мы сделаем так, чтобы наша русская буква занимала наш русский один байт,
а все остальные пусть мучаются с двумя и тремя. вот так.

Добавлено через 1 минуту
руникод будет называться.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
14.04.2021, 10:55
Лучший ответ Сообщение было отмечено ivan_proger как решение

Решение

Цитата Сообщение от ivan_proger Посмотреть сообщение
Можно ли вместо L'a' использовать static_cast<wchar_t>
Понятия не имею. Я в этих плюсовых извращениях не разбираюсь.
wchar_t также как и char - просто число. Зачем его еще к чему-то приводить? Впрочем, можете вывести как uint32_t и посмотреть диапазон букв
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <inttypes.h>
 
int main(){
  setlocale(LC_ALL, "");
  printf("%lc=%"PRIu32"\t%lc=%"PRIu32"\t%lc=%"PRIu32"\t%lc=%"PRIu32"\n", L'А', L'А', L'Я', L'Я', L'а', L'а', L'я', L'я');
}
Цитата Сообщение от x_lab Посмотреть сообщение
Ввод-вывод с консоли идёт в utf-8
работать можно только как с байтами... в cygwin например если запусккаю
Это у винды постоянно какие-то проблемы с кодировкой. Там надо добавить
C
1
2
3
4
5
6
7
8
9
#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
Цитата Сообщение от x_lab Посмотреть сообщение
но в wchar_t не все символы помещаются... которые помещаются в utf-8
Опять-таки виндо-специфичные баги, там wchar_t не полноценный, а 16-битный, соответственно и кодировка у них не utf-32 а utf-16, которая ни туда, ни сюда.
Цитата Сообщение от x_lab Посмотреть сообщение
русская буква 2 байта остальное по одному
Так я с этого и начал: если нужно только хранение, без особой обработки, можно обойтись utf-8. Но если, как ТСу, нужно коды символов преобразовывать, имеет смысл взять utf-32 (wchar_t).
То, во что оно там переводится при вводе-выводе это забота операционной системы и стандартной библиотеки.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.04.2021, 14:33
Цитата Сообщение от ivan_proger Посмотреть сообщение
Можно ли вместо L'a' использовать static_cast<wchar_t>(???)?
Нельзя. Потому что wchar_t - это тоже число, а не объект символа, потому ему присвоится именно 'a' в той 8-битной кодировке, в которой был сохранён исходный код программы. L'a' гарантирует, что символ будет скомпилирован не в той кодировке, в который исходный код, а именно в utf-16 .
1
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
14.04.2021, 15:07
Цитата Сообщение от TRam_ Посмотреть сообщение
L'a' гарантирует, что символ будет скомпилирован не в той кодировке, в который исходный код, а именно в utf-16
Только не в utf-16, а в utf-32, естественно. Для utf-16 скорее модификатор u:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <wchar.h>
 
int main(){
  printf("wchar[4]:\t%i\n", sizeof(L"fff"));
  printf("char_u[4]:\t%i\n", sizeof(u"fff"));
  printf("utf-8:  \t%i\n", sizeof("fff"));
  
  printf("ru_wchar[4]:\t%i\n", sizeof(L"ыыы"));
  printf("ru_char_u[4]:\t%i\n", sizeof(u"ыыы"));
  printf("ru_utf-8:\t%i\n", sizeof("ыыы"));
}
Code
1
2
3
4
5
6
7
8
$ gcc main.c
$ ./a.out 
wchar[4]:       16
char_u[4]:      8
utf-8:          4
ru_wchar[4]:    16
ru_char_u[4]:   8
ru_utf-8:       7
Добавлено через 1 минуту
UPD: Хм, для utf-32 оказывается не только L"", но и U"" работает. Надо бы проверить что у них с переносимостью.

Добавлено через 21 минуту
UPD2: Да, в стандарте прописано что
L - wchar_t, без указания размера, зато со спецификатором для printf
u - char16_t, зато без спецификатора для printf
U - char32_t, тоже без спецификатора.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.04.2021, 17:27
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
L - wchar_t, без указания размера
В частном случае компилятора мелкомягких - utf-16LE (https://docs.microsoft.com/ru-... w=msvc-160). В случае GCC таки utf-32
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
14.04.2021, 18:16
Цитата Сообщение от ivan_proger Посмотреть сообщение
Вывод кириллических символов по их коду в Linux
В данном случае все-таки utf-32.
Ну и ориентироваться на мелкомягкий "стандарт" в любом случае сомнительная идея. Взять хотя бы их аллергию на стандартные функции вроде printf.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2021, 18:16
Помогаю со студенческими работами здесь

Вывод кириллических символов из строки
Печатаю текст на русском языке и вывожу его в Label - все работает. Buf:=Edit1.Text; Label1.Caption:=Buf; Пытаюсь работать с...

Вывод кириллических символов на tft ili9341 spi, stm32f103
Доброго времени суток, не получается вывести, а точнее создать базу символов с кириллическими буквами для tft экрана. До этого всегда...

вывод символов по коду (программа на с)
Добрый вечер. Можете, пожалуйста, написать программу на си, которая считывает число и выводит на экран &quot;слово&quot;, состоящее из...

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

Краозябры кириллических символов в БД
Копался на форумах, но не смог найти нормальный ответ на этот вопрос. Вот таким вот образом я добавляю запись в БД: ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru