1

Тема: Спецсимволи в С++

Привіт.
Пишу одну карточну гру і необхідно вивести в консоль масть карти - ♥,♦,♣,♠ (Alt+3/4/5/6). Але так як в ANSII цих символів нема, то виникає питання чи є якийсь спосіб вивести ці символи через C++ так, щоб не виходили крякозябри?
https://s8.сайт-злодій/uploads/images/2017/04/fdb0142bcc4af239ac20096b368032ff.png

2

Re: Спецсимволи в С++

Це питання не про C++, а про те середовище, куди ви їх виводите. Оскільки ви ніц не сказали про нього, то й порадити вам щось важко.
І що таке в біса ANSII? Вікі такого не знає.

Подякували: 0xDADA11C7, varkon, ostap34PHP, leofun014

3

Re: Спецсимволи в С++

koala написав:

Це питання не про C++, а про те середовище, куди ви їх виводите.

Виводжу у cmd. Вводячи ці символи вручну - все нормально, читаючи, наприклад, з символьних об'єктів або файлів - крякозябри.

koala написав:

І що таке в біса ANSII? Вікі такого не знає.

ASCII таблиця, вибачте, друкарська помилка.
Трохи уточню. Наприклад, є в мене масив:

const string SUIT[] = { "♣", "♦", "♥", "♠" };

При виведенні, звісно, виводить знаки питання "?":
https://s8.сайт-злодій/uploads/images/2017/04/e3c97513585ab38319027798c0596fdd.png
Чи можна вивести дані символи так як вони є?

4

Re: Спецсимволи в С++

Вони не "є", вони певним чином закодовані. У вашому файлі використовується кодування, яке не розуміє CMD - ось і маєте знаки питання.
Спробуйте вивести рядок "\3\4\5\6" - це мають бути ваші ♥♦♣♠.

Подякували: LoganRoss, varkon, leofun013

5 Востаннє редагувалося LoganRoss (29.04.2017 17:20:54)

Re: Спецсимволи в С++

Трохи погуглив і вияснив, що таких символів немає в жодній таблиці кодування, принаймні з тих, що у VS Codepages (оф.сайт). У VS можна змінити кодування так: File->Advanced Save Options, однак потрібні символи в чистому вигляді не отримаємо як не крути. VS просто накладає обмеження, оскільки якщо використати спеціальне кодування, то інші (звичайні) символи не будуть розпізнаватися і код просто не компілюватимется.
Як писав пан koala, можна вивести "\3\4\5\6" і повинно вийти ♥♦♣♠, компілятор це розуміє, але оскільки в ніякому представленому кодуванні цих символів нема, то виводиться мазня.

6

Re: Спецсимволи в С++

Можете показати ту "мазню"?
https://image.ibb.co/c2okFk/image.png

Подякували: ostap34PHP1

7

Re: Спецсимволи в С++

koala написав:

Можете показати ту "мазню"?

https://s8.сайт-злодій/uploads/images/2017/04/c306720704fd9a13eaf4f79046eb2c13.png

8

Re: Спецсимволи в С++

koala написав:

Можете показати ту "мазню"?
https://image.ibb.co/c2okFk/image.png

Це Visual Studio?

9

Re: Спецсимволи в С++

Ні, звісно :)

Подякували: LoganRoss, leofun012

10

Re: Спецсимволи в С++

У VS можна змінити кодування так: File->Advanced Save Options, однак потрібні символи в чистому вигляді не отримаємо як не крути. VS просто накладає обмеження, оскільки якщо використати спеціальне кодування, то інші (звичайні) символи не будуть розпізнаватися і код просто не компілюватимется.

Тоді я, мабуть, правий. Проблема у VS.

11 Востаннє редагувалося Юра_Максименко (29.04.2017 19:42:36)

Re: Спецсимволи в С++

   #include <stdio.h>
   #include <iostream>

int main()
{
    int i=0;
    int j=0;
  stop:
    std::cout << "??" << std::endl;
    std::cin >> j ;
    if( j== -1)
        return 0;
  p:
    printf("hex= %x = %c \n", i, i);
    std::cout << i << std::endl;
    while(i>=0){i++; j++;
    if(j>1000)
        goto stop;
    goto p;
    }
 return 0;
}
Post's attachments

Console.exe.txt 1.07 mb, 389 downloads since 2017-04-29 

12

Re: Спецсимволи в С++

Зараз спробую пояснити сутність проблеми, як я її розумію.
Отже, є сирцевий код - у кодуванні S.
Компілятор його перетворює у виконуваний код, при цьому ресурси (зокрема рядки) можуть бути перетворені в кодування C.
Код запускається в консолі Windows з певними налаштуваннями локалі, зокрема кодуванням L (за замовчанням в кириличних Windows 866); при цьому може відбуватися відповідне перетворення.
Код символу, отриманий таким чином, використовується для того, щоб знайти в шрифті, який використовується консоллю, відповідний символ. Якщо його немає в шрифті - ви отримуєте отой знак питання в квадраті.

Таким чином, щоб бути певним у тому, що саме ви отримаєте на екрані, вам необхідно знати весь ланцюжок S->C->L і наявність відповідних символів в шрифті, інакше це працюватиме лише іноді і навмання.

Подякували: 0xDADA11C7, ostap34PHP, leofun013

13

Re: Спецсимволи в С++

тобто, ви хочете сказати, що код символа, який передається повинен відповідати такому шрифту в консолі. Значить, потрібно підібрати відповідний шрифт в самій консолі? Здається, я зрозумів. Піду пошукаю матеріал і щось почитаю про цей ланцюжок. Дякую, що вказали куди копати :)

14

Re: Спецсимволи в С++

Юра_Максименко написав:
   #include <stdio.h>
   #include <iostream>

int main()
{
    int i=0;
    int j=0;
  stop:
    std::cout << "??" << std::endl;
    std::cin >> j ;
    if( j== -1)
        return 0;
  p:
    printf("hex= %x = %c \n", i, i);
    std::cout << i << std::endl;
    while(i>=0){i++; j++;
    if(j>1000)
        goto stop;
    goto p;
    }
 return 0;
}

Вибачте, звісно, а що це за ****?

Подякували: koala1

15 Востаннє редагувалося Юра_Максименко (29.04.2017 20:17:57)

Re: Спецсимволи в С++

http://rsiqueira.postbit.com/upload/2/p … icode.html

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

Що це, це я написав щоб не паритися й довго не писати. Це зупинка а також продовження або вихід.

До речі я сам трохи голову не зламав з кодуваннями. Як загуглив..  Для досу, інших багато.. Півтори години чітав та гуглив.

http://lukom.org/blog/unicode-table

https://uk.wikipedia.org/wiki/Unicode

16 Востаннє редагувалося LoganRoss (29.04.2017 20:24:01)

Re: Спецсимволи в С++

дякую koala за допомогу. Як виявилося, у мене в консолі не вистачало одного шрифта по замовчуванню типу True Type. Скачав звідси - посилання на посилання (забув звідки саме, якась з тих посилань), встановив і все працює:
https://s8.сайт-злодій/uploads/images/2017/04/67efebdaa6113b868b54265ad1473686.pnghttps://s8.сайт-злодій/uploads/images/2017/04/59d1cf60a12f766fee120b961e0c7b50.png


Тому мої попередні повідомлення про те, як розумно розписував чого воно не працює прошу забути
https://s8.сайт-злодій/uploads/images/2017/04/0f6a2327996c8ad16db064d197a483fb.png

Подякували: Юра_Максименко1

17

Re: Спецсимволи в С++

можна так:

cout << (char)<Alt code>;

, де Alt code - код символу

18

Re: Спецсимволи в С++

koala написав:

Це питання не про C++, а про те середовище, куди ви їх виводите. Оскільки ви ніц не сказали про нього, то й порадити вам щось важко.
І що таке в біса ANSII? Вікі такого не знає.

ANSCII (МФА: [ˈæski], акронім від назви Американський стандартний код для інформаційного обміну, англ. American Standard Code for Information Interchange) в обчислювальній техніці — система кодів, у якій числа від 0 до 127 включно поставлені у відповідність літерам, цифрам і символам пунктуації.

Подякували: P.Y., LoganRoss2

19

Re: Спецсимволи в С++

ost.bregin2014 написав:
koala написав:

Це питання не про C++, а про те середовище, куди ви їх виводите. Оскільки ви ніц не сказали про нього, то й порадити вам щось важко.
І що таке в біса ANSII? Вікі такого не знає.

ANSCII (МФА: [ˈæski], акронім від назви Американський стандартний код для інформаційного обміну, англ. American Standard Code for Information Interchange) в обчислювальній техніці — система кодів, у якій числа від 0 до 127 включно поставлені у відповідність літерам, цифрам і символам пунктуації.

Сарказм (від грец. σαρκασμός, буквально «розривати [м'ясо]») — зла й уїдлива насмішка, вищий ступінь іронії, троп і засіб комічності, в основі якого лежить гострий дошкульний глум, сповнений презирства. Сарказм заснований не лише на посиленому контрасті між тим, що розуміється і тим, що висловлюється, але і на безпосередньому навмисному оголенні того, що розуміється.

Подякували: varkon, P.Y., ostap34PHP, 0xDADA11C7, LoganRoss, quez6