LINUX.ORG.RU

как вывести русские символы и символы псевдографики в консоль


0

1

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

Пробую вот такой код:

#include <stdio.h>

void main(void)
{


 char i;

 for(i = -128; i < 127; i++)
 {
  printf("%c", i);
 }
 printf("\n");


}

или такой

#include <stdio.h>

void main(void)
{


 unsigned char i;

 for(i = 0; i < 255; i++)
 {
  printf("%c", i);
 }
 printf("\n");


}

или вот такой

#include <stdio.h>

void main(void)
{


 unsigned int i;

 for(i = 0; i < 65535; i++)
 {
  printf("%c", i);
 }
 printf("\n");


}

Но во всех консолях в графических и в буквенных там где должны вывестись русские буквы или символы псевдографики выводятся вопросы или квадратики.

Команда locale вот что выдала:

LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

Только пожалуйста не предлагайте библиотеки ncurses, libsvga и т.д.

Хотелось бы разобраться конкретно в возникшем вопросе. За помощь заранее благодарен.

★★
echo -e "\0775"
Щ

Команда locale вот что выдала

А, извиняюсь тогда.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)

Ты пытаешься вывести одним байтом символы, для которых в UTF-8 нужно два байта. И чему здесь удивляться?

SoulThreads
()

1. Юзай setlocale().

2. Если тебе нужно что-то за пределами первой половины ascii, то юзай wchar либо glib'овые абстракции. Никогда не делай i < 255.

3. Прочитай debian i18n howto или классику, чтобы быть в курсе вещей.

И да, русский текст лучше не хардкодить, а делать через gettext.

x3al ★★★★★
()

man 2 write

anonymous
()
#include <iostream>
#include <stdio.h>

int main() {
	setlocale(LC_ALL, "");

	// C++
	std::wcout << L"«раз два»" << std::endl;

	// C
	printf("<raz %s\n", "dva>");
	printf("<raz %S\n", L"два»");
	wprintf(L"«раз %s\n", "dva>");
	wprintf(L"«раз %S\n", L"два»");

	return 0;
}
slovazap ★★★★★
()
Ответ на: комментарий от slovazap

А по алфавиту их вывести? Например, так:

cat 1.c
#include <stdio.h>
main(){
	int i;
	char alephbeth[] = "абвгдежзиклмнопрстуфхцчшщьыъэюя";
	for(i = 1; i < sizeof(alephbeth); i++)
		printf("%2d-я буква алфавита: %c\n", i, alephbeth[i-1]);
}

gcc 1.c  && ./a.out 
 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-я буква алфавита: ю
31-я буква алфавита: я

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от v4567

Погуглить по словам «c unicode» или выбрать другой язык.

PolarFox ★★★★★
()

v4567, если уж так хочется юникодом пользоваться, но при этом не хочется всякие зонды вставлять, советую не зацикливаться на «рисовании» в консоли, а использовать что-нибудь более подходящее для этого — хотя бы OpenGL или cairo какую-нибудь.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Eddy_Em помоги пожалуйста разобраться.

По команде locale -a смотрю доступные локали, есть строка ru_RU.koi8r Далее запускаю команду export LANG=ru_RU.koi8r проверяю командой locale и получаю:

LANG=ru_RU.koi8r
LC_CTYPE="ru_RU.koi8r"
LC_NUMERIC="ru_RU.koi8r"
LC_TIME="ru_RU.koi8r"
LC_COLLATE="ru_RU.koi8r"
LC_MONETARY="ru_RU.koi8r"
LC_MESSAGES="ru_RU.koi8r"
LC_PAPER="ru_RU.koi8r"
LC_NAME="ru_RU.koi8r"
LC_ADDRESS="ru_RU.koi8r"
LC_TELEPHONE="ru_RU.koi8r"
LC_MEASUREMENT="ru_RU.koi8r"
LC_IDENTIFICATION="ru_RU.koi8r"
LC_ALL=

Запускаю следующий откомпилированный код:

#include <stdio.h>

void main(void)
{


 unsigned char i;

 for(i = 0; i < 255; i++)
 {
  printf("%c", i);
 }
 printf("\n");


}

и всё равно вместо русских и псевдографики получаю вопросы.

v4567 ★★
() автор топика
Ответ на: комментарий от v4567

Терминал тоже должен поддерживать однобайтную локаль. Посмотри в настройках своего эмулятора терминала.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

Я к тому, что в настройках терминала должна стоять нужная кодировка.

Ну или в «нормальной» консольке сказать:

export LC_ALL=ru_RU.koi8-r
mapscrn koi2alt
loadkeys ruwin_alt-KOI8-R
setfont Cyr_a8x16

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Сколько проблем, а с юникодом я и не знаю, как оно в «консольке» включается — вcё из коробки.

anonymous
()
Ответ на: комментарий от anonymous

Ага, «из коробки»! А как надо несколько символов вызвать — фигвам…

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

Ну откуда же я про luit знаю, если у меня везде КОИ8? Попытался днем попробовать найти «родной» юникодовый терминал, прошелся по нескольким серверам — везде КОИ8…

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Eddy_Em я по поводу вывода символов псевдографики спрашиваю просто потому, что хочу написать консольный (консоль в буквенно-цифровом режиме) теттрис. Саму игру мне понятно как написать а вот то что касается взаимодействия с системой (вывод этих символов псевдографиуки, работа с клавиатурой и т. д.) пока всё в тумане. Eddy_Em может подскажешь что почитать по этому поводу. Я так понял что можно написать такой тетрис используя функции библиотеки glibc и системные вызовы, без всего остального можно обойтись? Может кто подскажет литературу по этому вопросу?

v4567 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.