C - символы не отображаются правильно в выводе - PullRequest
3 голосов
/ 05 марта 2019

Я могу вставить символ è в мой исходный код, но это не правильно отображается в выводе в моей программе;на его месте появляется символ Þ.

Символ è в расширенном ASCII соответствует 138.

Символ è в Юникоде соответствует 232число.

Символ Þ в ASCII Extended соответствует номеру 232.

Символ Þ в Unicode соответствует номеру 222.

Через отладчик можно заметить, что компилятор преобразует è с числом 232 и переводит целое число 138 как символ Š (набор табуляции строк), в то время как при выводе представляется номер символа 232как Þ и номер символа 138 представлен как è.

Что происходит за кулисами?

Пример кода:

#include <stdio.h>

int main (void)
{
    unsigned char a = 'è';
    unsigned char b = 138;

    printf ("Char a:% c \ n", a);
    printf ("Char a:% d \ n \ n", a);
    printf ("Char b:% c \ n", b);
    printf ("Char b:% d \ n \ n", b);

    return 0;
 }

Вывод:

Char a: Þ
Char to: 232
    
Char b: 'è'
Char b: 138

Что видит отладчик:

char a = 232 'è'
char b = 138 'Š'

Ответы [ 2 ]

5 голосов
/ 05 марта 2019

Я предполагаю, что вы работаете в Windows.

В результате ваш исходный код написан на Unicode, и поэтому символ è кодируется как число 232. Компилятор использует это значение в сгенерированной программе.

Когда ваша программа выполняется, этот код отправляется как параметр функции printf, но, поскольку Windows использует Extended ASCII, он интерпретируется как Þ при печати его в консоли.

Вы можете кодировать ваши файлы в Extended ASCII, чтобы иметь правильные символы.

Чтобы определить, какую кодировку использует ваша консоль, вы можете использовать это в Windows:

#include <windows.h>
unsigned cp = GetConsoleOutputCP();

Вы можете изменить консолькодирование следующим образом:

#include <windows.h>
SetConsoleOutputCP(1252); //Set console encoding to Windows 1252
SetConsoleOutputCP(65001); //Set console encoding to utf8

Устанавливает вывод консоли, но не ввод консоли, поэтому, если вам нужно работать с расширенным вводом пользователя ASCII, вам нужно использовать GetConsoleCP () и SetConsoleCP () для установки кодировки ввода.

Здесь вы можете увидеть другие доступные коды кодовых страниц здесь .

0 голосов
/ 05 марта 2019

Просто проверьте, что если вы напишите:

  printf("%d\n\n", 'è');

Тогда вы увидите, что char недостаточно для правильного значения.

...