LINUX.ORG.RU

Юникод чтение и запись в файл с произвольной кодировкой

 


0

1

имеется код для попытки освоения чтения и записи файлов в Юникоде:

wchar_t* tmp=L"TEST STRING РУССКИЙ";
size_t Wlen=wcslen(tmp);//Получаем длину строки WCHAR
iconv_t CD=iconv_open("UTF-8","WCHAR_T");//создаём дескриптор перекодировки
сhar* ic_in=(char*)tmp;//Приводим аргумент к указателю нужного типа.
size_t ic_in_bytes = (Wlen + 1) * sizeof(wchar_t);
void* BA=malloc(50);//Делаем буфер TODO: выяснить с предрасчётом длинны буфера, либо реализовать конверсию кусками если она так работает
char* buff=(char*)BA;
if ((iconv_t) -1 == CD) {
 perror("iconv_open");
 return EXIT_FAILURE;
}
size_t ic_out_bytes=50; //Указал длинну буфера TODO: проверить вылезет ли сама за нее


size_t Ret=iconv(CD, &ic_in, &ic_in_bytes, &buff, &ic_out_bytes);

if ((size_t) -1 == Ret) {
 perror("iconv");
 return EXIT_FAILURE;
}
printf( "WLen: %u\n", Wlen);
printf( "Ret: %u\n", ic_out_bytes);

//Пишем
File.open("t.txt",std::fstream::out);
File.write((char*)tmp,50);
File.close();
       
free (BA);//Чистим


return 0;
В итоге в файле фигня, причем полная ...

Вопрос почему ? и где я затупил ?

Вопрос второй , моя идея работать с текстом как с массивом wchar_t она адекватна ? или есть более нормальный способ? просто у меня по идее на входе текст может быть и в виндовой кодировке и в чем боженька пошлёт. Ну и последний вопрос , средства определения кодировки имеются ?

p.s. прошу обратить внимание что я форточник, так что с линками и с примерами ПЖСТ

Ответ на: комментарий от dzidzitop

Варианты не гАвна

И так суть такая , мне нужно обрабатывать файл вносить изменения править и так далее , в общем текстовой редактор, реализовать UNDO/ReUNDO и прочее , я не могу заморачиваться на размерности записи символов, мне проще исходник влить во что то универсальное и с ним работать а потом вылить в нужную кодировку ...

При таком подходе кроме wchart_t какие еще можешь порекомендовать варианты?

Не честно никогда не стояла даже под форточкой такая задача и яне чего умнее придумать не могу ...

Fastereus
() автор топика

File.write((char*)tmp,50); поменяй на File.write((char*)BA,50);

anonymous
()
Ответ на: Варианты не гАвна от Fastereus

Ещё раз - iconv работает с байтами. Кастовать wchar_t * к char * - бессмысленно. Только сам себя запутываешь.

wchar_t не имеет вменяемой семантики. Соответственно «обрабатывать файл вносить изменения править и так далее» ты не сможешь, не привязываясь к конкретному набору OS + compiler.

Для C++ могу посоветовать или использовать примитивы ICU или использовать char (как utf-8) или char16_t или char32_t.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

Я четко осознаю что wchart_t это не выгрузка в файл... но согласись делать например текстовой редактор и парсить многобайтные символы это просто маразм ? я думал грузить файл/часть файла в память парсить в wchart работать с этим а потом уже парсить в UTF8 и выгружать ....

Логично или я тут где то мыслю не верно ???

anonymous, мне кажется что я проидеотничил... спс ...

Fastereus
() автор топика
Ответ на: комментарий от Fastereus

wchar_t тоже может быть многобайтным. Например, в винде это так.

Для блокнотов можно пользоваться char32_t, который гарантированно однобайтный и соответствует (является таковым для любой реализации C++) UTF-32. А wchar_t это непришейкобылехвост, мертворождённый тип, который упорно продолжают насиловать.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
10 февраля 2018 г.
Ответ на: комментарий от dzidzitop

ХМ

Так хорошо, wcahart_t мертво рожденный ... шут с ним , тогда вопрос ребром ...

1-мне нужно вгрузить в раму файл , на неизвестном языке, но 100% UTF8 2-Произвести в нем замену например все буквы Ю на две буквы ГГ ... 3-Записать его в новый файл

то есть мне нужно даже не построчно а по символьно , что мне выбрать .. я нахожу кучу тем где одни вопросы но не одногоответа и примера .

Fastereus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.