@yourDaddy1337

Как я могу конвертировать число в символ?

Здравствуйте! В общем, вопрос достаточно феноменальный. Мне нужно сделать кое-какой скрипт шифрования для этого мне нужно воспользоваться языками Java и C++ и я столкнулся с такой серьезной проблемой, к примеру вот что происходит когда я конвертирую символ на Java:
Java:
System.out.println((char)3);
Output::
(символ который используется в окончаниях строк, браузеры его не видят)


C++:
cout << (char)3 << endl;
Output:

Все ответы которые так легко загуглить - я пробовал, но ничего не помогло, мне нужно чтобы оно правильно не просто выводило в консоль, а и правильно интерпретировало сами символы в коде т.е. чтобы я мог обменивать информацией между Java и С++ кодом и при этом символы не ломались

Вот перечень всех решений которые я пробовал:
1. Изменял кодировки C++ проекта (Unicode Character Set & Multi-Byte Character Set)
2. Использовал wchar, wchar_t, wstring, и им подобные
3. Пробовал менять кодировку при помощи этой строки: SetConsoleOutputCP(CP_UTF8); & std::locale::global(std::locale(""));
4. Пробовал использовать всякие wstring_convert
5. Проверял все виды кастов (static_cast и т.д.)
  • Вопрос задан
  • 238 просмотров
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
System.out.println((char)3);

Так не надо делать. Это получение Unicode символа по коду 3.
Оно сработает но с точки зрения code-review некрасиво и твоя команда
будет тебя бить и чморить за такой способ кастинга.

В java есть специальные литералы для работы с кодировками.
Например для символа с кодом 3 (однобайтного типа ASCII)
'\x03'
Или например для кириллической буквы А в кодировке UTF-16
'\u0430'
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Проблема в кодировке ascii. Код символа '3' не равен 3.

На c++ можно делать так:
(char)(x+'0')

Этот код преобразует цифру x в символ, ей соответствующий. Лучше, правда приводить тип через static_cast.

Еще можно воспользоваться всякими to_string, будет даже читабельнее, но медленнее.
Ответ написан
@Dementor
программист, архитектор, аналитик
вопрос достаточно феноменальный

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

сделать кое-какой скрипт шифрования

Для начала стоит прояснить что подразумевается под шифрованием:
1) приведение неких бинарных данных в нечитаемый без ключа шифрования вид?
2) приведение неких бинарных данных в читаемый в браузерах вид (URL-кодирование)?
3) сжатие данных для минимизации трафика (типа дефлейта)?
4) приведение данных к универсальному формату для обмена между различными системами (типа протобафа)

я столкнулся с такой серьезной проблемой

Тут у вас два примера на разных языках по выводу текстовой информации в стандартный поток вывода, который выводится на консоль. А в чем собственно проблема и как она связана с задачей шифрования? Ваши системы обменивают информацией через вебкамеры, которые направлены на консольный вывод друг-друга?

Хотите вывести в консоль идентичные "символы"? Тогда для начала проясните для себя, что такое "символ" и что в разных системах для внешне похожих графических символов используются различные виды кодировок и различные таблицы символов. Ваша программа на С++ использует CP866, а программа на Java Win-1251 или UTF-8 (зависит от настроек и от операционной среды).

правильно интерпретировало сами символы в коде т.е. чтобы я мог обменивать информацией между Java и С++ кодом и при этом символы не ломались

Смотрите ответ выше про различные таблицы символов и поймете, что ваш вопрос в текущей постановке не имеет смысла. Там более он бессмысленный в контексте реализации алгоритмов шифрования, где вы работаете на уровне битов и байтов.

Могу допустить, что тут изначально речь была про возможность пересылки текстов между различными системами с последующим выводом их в консоль. Тогда нужен промежуточный формат - для простоты пусть это будет UTF-8. Тогда на стороне Java-программы ничего менять не нужно - она получает, передает и выводит в консоль текст в кодировке UTF-8. А на стороне С++ нужно реализовать (скопировать со СтекаОверфлоу или Гитхаба) функции по трансляции таблиц символов: храним и выводим в консоль досовскую кодировку, при отправлении кодируем, а при получении декодируем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы