Я пытаюсь представить 8-битные числа с символами, и я не хочу использовать int для определения символа, я хочу использовать фактический символ символа. Но когда я использую стандартные коды ASCII, все, что выходит за пределы диапазона 32-100, совершенно другое.
Итак, я перебрал все 256 кодов ascii и напечатал их, например, он сказал, что этот символ «±» — это код 241. Но когда я копирую и вставляю этот символ из консоли или даже использую альтернативный код, он говорит, что символ код -79... Как я могу совместить эти две вещи? Спасибо!
Это проблема кодировки наверное. Вам нужен CP ISO 8859-1 для отображения 1:1 между символами 0-255 и Unicode 0-255.
@ChrisMM Является ли char подписанным или неподписанным, определяется реализацией.
Попробуйте SetConsoleOutputCP(28591). Вам нужно будет включить windows.h
@heapunderrun и в MSVC char подписан по умолчанию. В этом нет ничего плохого
@heapunderrun, в заголовке написано Visual Studio, поэтому я предполагаю компилятор CL и ML, а не код VS с другим компилятором. VS использует знаковый символ.





Это должно быть проблемой кодировки. Консольные приложения Windows имеют кодовую страницу, которая «сопоставляет» символы 0–255 с подмножеством символов Unicode. Это то, что существует с эпохи до Unicode для поддержки неамериканских наборов символов. Есть несколько Windows API для выбора кодовой страницы для консоли: SetConsoleOutputCP (и SetConsoleCP для ввода)
#include <iostream>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
int main() {
unsigned int cp = ::GetConsoleOutputCP();
std::cout << "Default cp of console: " << cp << std::endl;
::SetConsoleCP(28591);
::SetConsoleOutputCP(28591);
cp = ::GetConsoleOutputCP();
std::cout << "Now the cp of console is: " << cp << std::endl;
for (int i = 32; i < 256; i++) {
std::cout << (char)i;
if (i % 32 == 31) {
std::cout << std::endl;
}
}
}
Кодовая страница 28591 — это кодовая страница iso-8859-1, которая сопоставляет символы 0–255 с кодовыми точками Unicode 0–255 (номер 28591 взят из https://learn.microsoft.com/en-us/windows/ win32/intl/идентификаторы кодовой страницы)
Итак, я попробовал это, и теперь он сопоставляет код ascii с правильным символом, но все еще не сопоставляет символ с правильным кодом. При преобразовании «±» в int это все еще дает мне -79.
@TristanAlexander -79 подписан char 0xB1, то же, что и 177, если считать его беззнаковым. Это правильный код для ± как в ISO/IEC 8859-1 , так и в кодовых страницах ANSI Windows-1252 . Код, который вы цитируете 241, используется в кодовой странице OEM 437.
@dxiv А, хорошо, есть ли решение моей проблемы? Или мне нужно использовать int для определения всего? Я думаю, это нелепо, что (char)('±' + 0) не равно '±', оно соответствует совершенно другому символу.
@dxiv Хорошо, nvm, это равно тому, что дал мне другой парень. Кажется, теперь я вижу, что 177 просто превращается в -79, и поэтому символы не совпадают с числами.
@dxiv Также знаете ли вы, что если умножение или добавление символов на мгновение преобразует их в целые числа? О, это действительно хорошо, ха-ха
@TristanAlexander Если вам нужны красивые положительные числа (и я скажу, что отрицательные символы действительно уродливы), вы можете использовать unsigned char. Просто постарайтесь НЕ делать: for (unsigned char ch = 32; ch < 255; ch++) потому что это бесконечный цикл.
ASCII 0-127, к вашему сведению.
charтакже подписан по умолчанию.