Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: villimon в Dec 01, 2014, 16:59



Титла: Изгубени в encoding-а
Публикувано от: villimon в Dec 01, 2014, 16:59
Здравейте,

ще съм ви благодарен ако ми дадете някаква насока защото каквото пробвам стигам до задънена улица.

Първо: Опитвам се да извлека HTML страница.

Второ: Записвам я във файл текстов с разширение .html

Трето: Отварям файла и го парсвам.

По време на третата стъпка текста, който парсвам ми излиза в формат РѕСЃРёРіСѓС да спомена че страниците са на кирилица. Стигнах до няколко наблюдения когато файла е UTF-8 ми се получава така. Когато е ANSI нещата изглеждат нормални.

Възможно ли е когато тегля html страницата тя да се тегли с encoding на файла който се създава. Защото пробвам основно с два сайта и ми излизат двата различни резултата.

Вече всякакви налудничави теории приемам. Но ако някои може да ми обясни как стоят нещата ще съм много благодарен.

може да има такава тема и ще съм благодарен ако ме насочите към нея.


Титла: Re: Изгубени в encoding-а
Публикувано от: korea60 в Dec 01, 2014, 17:30
Нямам идея с какав език правиш цялата процедура? Ако отваряш текста в команд пром енкодинга е cp866, линукски терминал, не би трябвало да има проблем с cp1251 и utf-8.
Общо взето трябва да кажеш как точно парсваш текста, т.е. с какав език, за да ти кажа евентуално как се ползва енкодинг и декодинг.


Титла: Re: Изгубени в encoding-а
Публикувано от: villimon в Dec 01, 2014, 17:33
Да това щеше да е хубаво да го кажа в началото

всичко се пише на C++


Титла: Re: Изгубени в encoding-а
Публикувано от: korea60 в Dec 01, 2014, 18:42
#include<locale.h>
int main(){
setlocale(LC_ALL, "Bulgarian");
SetConsoleOutputCP(1251)
printf ("%s", Ала бала);
}

Това ползвам за да мога да изкарам текста на български, работи за C, вероятно е подобно на C++, не съм сигурен. Но сигурно проблема е че искаш целият парснат текст да се преведе, без да ги викаш на отделни части, за това не съм сигурен как става, все някои ще пише нещо.


Титла: Re: Изгубени в encoding-а
Публикувано от: villimon в Dec 01, 2014, 20:26
Пробвах:

setlocale(LC_ALL, "bulgarian");
SetConsoleOutputCP(1251);
std::locale::global(std::locale(""));
AnsiToOem(a, b);

locale mylocal("");
file.imbue(mylocal); // за файла в който записвам

обработването на текста(файла) го правя символ по символ и няма резултат


Титла: Re: Изгубени в encoding-а
Публикувано от: remotexx в Dec 02, 2014, 04:43
Това което ти трябва е следната библиотека
libicu52
International Components for Unicode

поне при мен в тестовия дебиян версията е следната
Version: 52.1-6
Size:      28.0 MB

International Components for Unicode
 
ICU is a C++ and C library that provides robust and full-featured
Unicode and locale support.  This package contains the runtime
libraries for ICU.

Така - това е за пълноценна работа, ако ти трябва само валидиране виж тук - простичко е
http://en.wikipedia.org/wiki/UTF-8#Description
Имай предвид че тази кодировка е с променлив брой байтове per code point
от 1 до 6 байта на символ

П.П. но дори и правилно валидиран текст пак може да е пълна безсмислица  (напр. шщюя) та ако ще е професионално обик. се ползва съвместно и с библиотека за разпознаване на езика
libexttextcat
https://packages.debian.org/search?keywords=libexttextcat