Форум программистов, компьютерный форум, киберфорум
мама Стифлера
Войти
Регистрация
Восстановить пароль
Рейтинг: 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 . . .
Размещено в Без категории
Показов 7104 Комментарии 25
Всего комментариев 25
Комментарии
  1. Старый комментарий
    Аватар для Croessmah
    Обычно, внутри программы строки хранятся в определенной кодировке (например, utf-8).
    Входящие строки конвертируем в нашу внутреннюю кодировку, а при выводе преобразовываем в нужную.
    Запись от Croessmah размещена 22.09.2021 в 23:34 Croessmah вне форума
  2. Старый комментарий
    Аватар для мама Стифлера
    Это я понимаю, я специально привел пример разных кодировок, чтоб показать возможность смены в коде для каждой кодировки.
    По хорошему нужно писать все в одной кодировке(текстовые файлы и коды программ), тогда проблемы с переключениями отпадут.
    Запись от мама Стифлера размещена 22.09.2021 в 23:45 мама Стифлера на форуме
  3. Старый комментарий
    Цитата:
    Теперь та же ерунда, но с другого бока
    Это не ерунда. Главная ошибка была сделана ещё полвека назад, когда в СССР не стали создавать свои языки программирования (на русском языке естественно). А воспользовались готовым продуктом наших американских "друзей". Вот сейчас мы и пожинаем плоды того недальновидного решения.
    Запись от wer1 размещена 23.09.2021 в 07:54 wer1 на форуме
  4. Старый комментарий
    Аватар для Avazart
    Не создали потому что не могли.

    В данном случае проблема скорее в Windows и скажем так в её "истории" "поддержке обратной совместимости" и прочим. Говоря иначе если бы не было бы всяких windows cp 12** кодировок а появился бы сразу юникод то проблемы бы не было бы.

    Кстати для MSVC нужен BOM что бы она корректно распознала UTF-8
    Запись от Avazart размещена 23.09.2021 в 09:49 Avazart на форуме
    Обновил(-а) Avazart 23.09.2021 в 09:54
  5. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Не создали потому что не могли.

    проблема скорее в Windows в её "истории" "поддержке обратной совместимости" и прочим.
    Говоря иначе если бы не было бы всяких windows cp 12** кодировок
    Наверное не могли... или денег не хватило - Всё на космос потратили

    И всё-таки надо было создать нечто Русское! И пусть Америка тратит деньги на поддержку английского языка.
    Запись от wer1 размещена 23.09.2021 в 12:30 wer1 на форуме
  6. Старый комментарий
    Аватар для ft4l
    Цитата:
    в СССР не стали создавать свои языки программирования (на русском языке естественно).
    естественнее сразу на многобайтной кодировке 15-и республик СССР
    Запись от ft4l размещена 23.09.2021 в 14:08 ft4l вне форума
  7. Старый комментарий
    Аватар для Avazart
    Запись от Avazart размещена 23.09.2021 в 20:10 Avazart на форуме
  8. Старый комментарий
    Аватар для Замабувараев
    На Двадцать Первый век, а вы всё со своими кодировками возитесь.
    Переходите на юникод.
    Для ввода‐вывода текста на консоль используйте функции ReadConsoleW и WriteConsoleW, они работает с юникодом.
    Литералы сохраняйте сразу в юникоде.
    Запись от Замабувараев размещена 25.09.2021 в 22:19 Замабувараев на форуме
  9. Старый комментарий
    Добавлю свои "5 копеек" https://zelserg.livejournal.com/2117.html
    Запись от zer0mail размещена 26.09.2021 в 09:14 zer0mail вне форума
  10. Старый комментарий
    Аватар для Avazart
    Не все так просто с юнкодом+консолью+виндовс тут стоит думать.

    Главным образом проблема с вводом юникодного текста
    Запись от Avazart размещена 27.09.2021 в 12:23 Avazart на форуме
  11. Старый комментарий
    Аватар для Замабувараев
    >Главным образом проблема с вводом юникодного текста
    ReadConsoleW работает с юникодом без всяких проблем.
    Запись от Замабувараев размещена 27.09.2021 в 14:19 Замабувараев на форуме
  12. Старый комментарий
    Аватар для мама Стифлера
    Цитата:
    Сообщение от Замабувараев Просмотреть комментарий
    На Двадцать Первый век, а вы всё со своими кодировками возитесь.
    Переходите на юникод.
    Вопросы о проблемах с кодировкой, периодически всплывают до сих пор. Так что переход на юникод не решает проблему, а всего лишь обходит ее стороной. Некоторых людей такой вариант вполне устраивает. Но в таком случае проблема с кодировкой так и останется не решенной.
    Запись от мама Стифлера размещена 27.09.2021 в 17:30 мама Стифлера на форуме
  13. Старый комментарий
    Аватар для Замабувараев
    Поясните, в каких случаях в консоли следует использовать кодировки вместо юникода?
    Запись от Замабувараев размещена 27.09.2021 в 17:34 Замабувараев на форуме
  14. Старый комментарий
    Аватар для мама Стифлера
    В теме блога описаны случаи и то не все. И юникод кстати тоже является кодировкой, если на то пошло. А текстовые файлы, взятые с разных источников, с большой вероятностью будут иметь разные кодировки относительно друг друга.
    Запись от мама Стифлера размещена 27.09.2021 в 18:35 мама Стифлера на форуме
  15. Старый комментарий
    Аватар для Avazart
    Цитата:
    Цитата:
    Главным образом проблема с вводом юникодного текста
    ReadConsoleW работает с юникодом без всяких проблем.
    Если исходники в utf-8 то предлагаете wstring каждый раз переконвертировать в wstring?
    Что делать с парсингом int, float как это обычно делается через std::cin ? Делать вперемешку с ReadConsoleW ?

    Обычно все сводится к отказу от кириллицы и все на английском или отказ от консольного приложения в пользу GUI.
    Запись от Avazart размещена 27.09.2021 в 20:00 Avazart на форуме
    Обновил(-а) Avazart 27.09.2021 в 20:03
  16. Старый комментарий
    Аватар для Замабувараев
    0. Просто ставьте перед литералами L.
    1. В какой кодировке ваши исходники — на екзешник это не влияет.
    2. Очевидно, что ваша библиотека std::cin не работает с юникодом, иначе бы не существовало этой темы. Я не понимаю зачем нужно пользоваться библиотекой которая не работает.
    3. Функция ReadConsoleW работает с юникодом. Вам не составит большого труда преобразовать возвращённую юникодную строку в число какой‐нибудь функцией _wtoi или её аналогом.
    4. А это вообще бред из той оперы где «все профессиональные программисты разговаривают только на английском языке».
    Запись от Замабувараев размещена 27.09.2021 в 20:18 Замабувараев на форуме
  17. Старый комментарий
    Аватар для Avazart
    Цитата:
    0. Просто ставьте перед литералами L.
    Куда поставить? Если у меня utf-8 и все в std::string ?
    Т.е. есть разница между utf-8 и utf-16 и std::string и std::wstring
    Для сравнения стоит попробовать Linux где такая проблема как с windows не чувствуется даже.

    Цитата:
    2. Очевидно, что ваша библиотека std::cin не работает с юникодом, иначе бы не существовало этой темы. Я не понимаю зачем нужно пользоваться библиотекой которая не работает.
    Стоит уточнять она не работает под виндос. И не моя а вообще наша ...

    Цитата:
    Вам не составит большого труда преобразовать возвращённую юникодную строку в число какой‐нибудь функцией _wtoi или её аналогом.
    И Вас ни разу не смущает такая убогость?

    Цитата:
    4. А это вообще бред из той оперы где «все профессиональные программисты разговаривают только на английском языке».
    Это простой расчет можно написать ПО на английском и оно будет с нормальным поддерживаемым читаемым кодом и работать будет предсказуемо или же выпендрится и сделать на русском но с дикими костылями и плохо пахнущим кодом.
    И стоит учитывать что это приложение будет при это консольным, т.е. изначально не на обычных пользователей.

    Хотя опять же в python эта проблема тоже решается очень просто в отличии от С++.
    Запись от Avazart размещена 27.09.2021 в 20:25 Avazart на форуме
    Обновил(-а) Avazart 27.09.2021 в 20:34
  18. Старый комментарий
    Аватар для ft4l
    Цитата:
    Сообщение от мама Стифлера Просмотреть комментарий
    проблема с кодировкой так и останется не решенной.
    Всё решаемо, более-менее )
    кроме того, что автоматически отличить одну однобайтную кодировку от другой практически невозможно,
    в некоторых случаях .)
    Но совсем отказываться от однобайтных тоже не вариант.
    Просто нужно вместе с текстами хранить мета-информацию типа кодировка такая-то язык такой-то...

    С ЯП похожая проблема, например файл с расширением .inc ) я так и не понимаю на каких ЯП может содержать текст ))
    и в каких кодировках тоже.
    Запись от ft4l размещена 27.09.2021 в 21:40 ft4l вне форума
  19. Старый комментарий
    Аватар для Avazart
    С ЯП разве не все ясно? Должно быть в UTF-8
    Запись от Avazart размещена 28.09.2021 в 12:45 Avazart на форуме
  20. Старый комментарий
    Аватар для ft4l
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    С ЯП разве не все ясно? Должно быть в UTF-8
    В виндовс ? )) там локали такой даже нет
    Как-бы да , там ресурсы это rc.exe c флагом -c65001 собирает в двух-байтный юникод,
    для всего , не только собираемого с -DUNICODE,
    В Richedit вообще можно выводить попеременно в куче кодировок , только переключаясь на их использование.
    ...
    Но я-бы не сказал что любое в utf8 можно смело использовать в любых местах ) если нет такой локали
    Не знаю завезли-ли в win-10 ))
    Запись от ft4l размещена 28.09.2021 в 13:28 ft4l вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.