Форум программистов, компьютерный форум, киберфорум
мама Стифлера
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

Про кодировки... навеяло

Запись от мама Стифлера размещена 22.09.2021 в 22:48

Слегка про кодировки...
Так выглядит код, написанный в кодировке UTF-8. А моя IDE поддерживает только кодировку 1251. Поэтому в редакторе выглядит все очень печально

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main(void)
{
//SetConsoleCP(CP_UTF8); /*необходимо <windows.h>*/
//SetConsoleOutputCP(CP_UTF8); /*необходимо <windows.h>*/
//
//SetConsoleCP(1251); /*необходимо <windows.h>*/
//SetConsoleOutputCP(1251); /*необходимо <windows.h>*/
 
    char s[200];
    FILE *FP = fopen("f1.txt", "r");
    fgets(s, 200, FP);
    puts("Прочитана строка РёР· файла:");
    fclose(FP);
 
//SetConsoleOutputCP(CP_UTF8); /*необходимо <windows.h>*/
    puts(s);
}
Задача состоит в том, чтоб прочитать текст из файла в консоль и чтоб текст был понятный и читабельный. Но по умолчанию, для консоли установлена кодировка 866. И если я сейчас дам команду <выполнить>, то получу в консоли вот это:
Код:
╨Я╤А╨╛╤З╨╕╤В╨░╨╜╨░ ╤Б╤В╤А╨╛╨║╨░ ╨╕╨╖ ╤Д╨░╨╣╨╗╨░:
╨Ъ╨╕╤А╨╕╨╗╨╗╨╕╤З╨╡╤Б╨║╨╕╨╣ ╤И╤А╨╕╤Д╤В

--------------------------------
Process exited after 0.13 seconds with return value 0
Для продолжения нажмите любую клавишу . . .
Но выход все же есть. Нужно подключить строку#8, и подключить заголовочный файл в строке #3. Как видно ниже, результат получится удовлетворительный
Код:
Прочитана строка из файла:
Кириллический шрифт

--------------------------------
Process exited after 0.1241 seconds with return value 0
Press any key to continue . . .

Теперь та же ерунда, но с другого бока
А вот так выглядит код, написанный в кодировке 1251. Прямо красота, все красиво и понятно написано
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main(void)
{
//SetConsoleCP(CP_UTF8); /*необходимо <windows.h>*/
//SetConsoleOutputCP(CP_UTF8); /*необходимо <windows.h>*/
//
//SetConsoleCP(1251); /*необходимо <windows.h>*/
//SetConsoleOutputCP(1251); /*необходимо <windows.h>*/
 
    char s[200];
    FILE *FP = fopen("f1.txt", "r");
    fgets(s, 200, FP);
    puts("Прочитана строка из файла:");
    fclose(FP);
 
//SetConsoleOutputCP(CP_UTF8); /*необходимо <windows.h>*/
    puts(s);
}
Даю команду выполнить и получаю очередные крякозябры
Код:
╧ЁюўшЄрэр ёЄЁюър шч Їрщыр:
╨Ъ╨╕╤А╨╕╨╗╨╗╨╕╤З╨╡╤Б╨║╨╕╨╣ ╤И╤А╨╕╤Д╤В

--------------------------------
Process exited after 0.01937 seconds with return value 0
Для продолжения нажмите любую клавишу . . .
Хоть в редакторе все понятно читается, но для консоли с кодировкой 866, моя кодировка программы(1251) и кодировка текстового файла(UTF-8), останутся не читаемыми. В этот раз у меня две разные кодировки, а в коде придется переключать их нужном месте:
Первым делом переключаю в строке#11(переключаю на кодировку 1251). Она нужна для вывода текста в строке#16.
После строки#16 можно переключать на другую кодировку(UTF-8). Переключение делаю в строке#19, как раз перед строкой вывода текста. В итоге все получилось как надо.
Код:
Прочитана строка из файла:
Кириллический шрифт

--------------------------------
Process exited after 0.06684 seconds with return value 0
Press any key to continue . . .
Размещено в Без категории
Показов 7340 Комментарии 25
Всего комментариев 25
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Цитата:
    В виндовс ? )) там локали такой даже нет
    Ну да. Если речь конечно не про простые консольные приложения с кириллицей.
    Запись от Avazart размещена 28.09.2021 в 13:31 Avazart вне форума
  2. Старый комментарий
    Аватар для Замабувараев
    Цитата:
    Куда поставить? Если у меня utf-8 и все в std::string ?
    Т.е. есть разница между utf-8 и utf-16 и std::string и std::wstring
    Для сравнения стоит попробовать Linux где такая проблема как с windows не чувствуется даже.
    Вы можете хранить строки как угодно, однако юникодные функции WinAPI должны принимать строку в кодировке UTF-16. Я не понимаю почему разработчики библиотек std::string и std::wstring не могут осилить такой простой факт, а пользователи этих кривых библиотек постоянно отсылают «а вот в линексе всё работает».

    Цитата:
    И Вас ни разу не смущает такая убогость?
    Меня не смущают прямые вызовы операционной системы. Меня смущает убогость разработчиков std::string, std::wstring std::cin и прочего, которые не могут в вызовы юникодных функций. Неужели передавать массив байт UTF-16 в функцию с буквой W на конце — это такая сложная задача?

    Цитата:
    или же выпендрится и сделать на русском но с дикими костылями и плохо пахнущим кодом.
    Я не понимаю, почему вызов функции операционной системы — это для вас дикие костыли и дурно пахнущий код. Убогость — это пользоваться неработающими библиотеками, с подпорками из костылей в виде SetConsoleCP или system("1251").
    Запись от Замабувараев размещена 29.09.2021 в 12:16 Замабувараев вне форума
  3. Старый комментарий
    Аватар для SmallEvil
    Никакие вызовы WINAPI не спасают покалеченную виндовскую консоль.
    Что там в недо-системах Win10+ ваще не интересует.
    Так как они изначально не поддерживают переносимость кодов. Под каждую их сборку компилируй отдельно, подстраивайся под ихние все новые и новые костыли.
    Шансов долгожительства ОС Windows уже давно под вопросом.

    Замабувараев,
    Поэтому когда говорят про кросс-платформенность или переносимый код, или нормальный, про ОС Windows не думают, потому как смысла особого нету.

    Тема работы с различными кодировками в одной программе, включая Юникод - это задача не для новичка. И поэтому еще долгие годы будут такие темы и вопросы.
    Запись от SmallEvil размещена 02.10.2021 в 02:43 SmallEvil вне форума
  4. Старый комментарий
    Аватар для SmallEvil
    До сих пор не могу понять почему Windows не перешел на UCS4 внутри приложения.
    Или хотя бы такую возможность...
    Запись от SmallEvil размещена 02.10.2021 в 02:44 SmallEvil вне форума
    Обновил(-а) SmallEvil 02.10.2021 в 02:47
  5. Старый комментарий
    Аватар для Avazart
    Вообще то все сказанное выше бред.
    Windows давно использует UTF16 но! - для GUI.
    Пилить консоль что-то там менять видимо просто харит.


    Цитата:
    Вы можете хранить строки как угодно, однако юникодные функции WinAPI должны принимать строку в кодировке UTF-16. Я не понимаю почему разработчики библиотек std::string и std::wstring не могут осилить такой простой факт, а пользователи этих кривых библиотек постоянно отсылают «а вот в линексе всё работает».
    Вот именно. Я не хочу использовать WinApi я хочу использовать STL и выводить/вводить в стандартные stream-мы в UTF-8. И так в Linux оно действительно работает! И странно как раз другое почему оно под Windows & C++ не работает. Ведь в разработчики python как то же решили проблему.
    Не ужели из коробки нельзя иметь решение с нужными переконвертациями?
    Запись от Avazart размещена 02.10.2021 в 10:40 Avazart вне форума
    Обновил(-а) Avazart 02.10.2021 в 10:50
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.