0

Мне нужно открыть ZIP архив, затем найти в нём файл, и вывести содержимое этого файла(файл .txt). Для этого я нашел пример этого который работает с библиотекой libzip. Но когда я запускаю эту программу, то символы английской раскладки выводятся нормально, а вот символы кирилицы выводятся каким то набором символов. Подскажите пожалуйста что можно сделать в этой ситуации.

Код

#include <iostream>
#include <zip.h>
#include <locale.h>
using namespace std;

int main() { setlocale(LC_CTYPE, ""); //Open the ZIP archive int err = 0; zip* z = zip_open("file.zip", 0, &err);

//Search for the file of given name
const char* name = &quot;text.txt&quot;;
struct zip_stat st;
zip_stat_init(&amp;st);
zip_stat(z, name, 0, &amp;st);

//Alloc memory for its uncompressed contents
char* contents = new char[st.size];

//Read the compressed file
zip_file* f = zip_fopen(z, name, 0);
zip_fread(f, contents, st.size);
zip_fclose(f);

//And close the archive
zip_close(z);
cout &lt;&lt; contents;
//Do something with the contents
//delete allocated memory
delete[] contents;

}

exiperon
  • 13
  • 1
  • 3
  • а как именно выглядит кириллический текст? может там utf-8 в файле. – KoVadim Sep 29 '20 at 14:10
  • 3
    Возможный дубликат вопроса: Русский язык в консоли – dIm0n Sep 29 '20 at 14:11
  • Он выглядит вот так: Р-С'Р? С?С?С?С?РєР°С? С?Р°С?РєР>Р°Р?РєР°(Там написано: Это русская раскладка) It is a textээээ (ээээ - оно всегда почему то добавляет в конец). – exiperon Sep 29 '20 at 14:13
  • Насчет сout, у меня кирилица отображается нормально. – exiperon Sep 29 '20 at 14:16
  • 1
    libzip тут не причем. она просто разжимает файл и отдает вам как есть. А файл - это просто набор байт. За то как эти самые байты выглядят на экране отвечает кодировка.Русский язык бывает в кодировках UTF8, cp1251, cp1252, koi8-r и еще нескольких экзотических. Для вывода файла на экран сначала надо узнать в какой он кодировке и перевести в ту кодировку которая у вас на экране или кодировку экрана привести к той, которая в файле... – Mike Sep 29 '20 at 14:19
  • 1
    По ссылке выше про язык консоли как раз говорится про приведение экран к требуемой кодировке. Если у вас сейчас cout выводит строку правильно, это лишь значит, что строка в исходном коде вашей программы набрана в той же кодировке, что и на консоли. А вот в файле в архиве кодировка другая. И кстати однозначного способа определения кодировке, кроме статистического анализа текста не существует, она должна быть известна заранее. Не зря текстовые редакторы позволяют просматривать файлы выбирая кодировку вручную – Mike Sep 29 '20 at 14:20
  • Понятно, я тогда пошел определять кодировку – exiperon Sep 29 '20 at 14:23
  • Поменял кодировку txt файла на ANSI, теперь всё работает – exiperon Sep 29 '20 at 14:27
  • 1
    по кодировке выше - это utf-8. Значит, либо выставляйте подходящую кодировку в консоли, либо перекодируйте в кодировку Вашей системы – KoVadim Sep 29 '20 at 14:27

0 Answers0