Problem z kodowaniem w C#

0

za pomogą funkcji "IndexOf" ściągam treść ze strony www. Wszystko kodowało mi się jak po maśle, dopóki nie skompilowałam. Po testowaniu programu okazało się, że wszystko działa jak należy ale pobrana treść nie wyświetla znaków polskich. Treść wygląda mniej więcej w ten sposób:

podstawową zasadą trenowania Należy pamiętać, cierpliwości i nie

Pytanie dlaczego i jak temu zaradzić? Próbowałam zmienić język domyślny na PL ale nic z tego...

0

w czym to wyświetlasz/do jakiej zmiennej zapisujesz znaki

0

do zmiennej string, bo to co pobieram jest tekstem, a wyświetlać próbowałam chyba juz we wszystkim teksboksie, lablu, richbox itd.
I nawet zrobiłam test, pobrałam treśc ze strony i zapisałam go do pliku txt za pomocą funkcji FileStream, i jak sie okazuje w notatniku tez wyrodziły sie krzaczki

0

Bo string to łańcuch charów. A char nie przyjmie większej wartości niż 255. Polskie znaki diakrytyczne mają wartości powyżej, więc niektóre bity są ucinane (względem wielkości char. tzn część jest "przenoszona" do następnego elementu stringa.)
Spróbuj użyć wstring.

0

w C# nie ma chyba takiego czegoś jak wstring

1

no i posiało wszystkich facetów na mecz! nie ma kto mi pomoc;p

Mecz? W życiu.
Edit: O, nie tylko ja: http://4programmers.net/Forum/Flame/199834-ogladasz_mecze_uefa_euro_2012

Ale zanim pomożemy, podaj kod który masz (w szczególności to pobieranie ze strony www).
Masz gdzieś błąd z kodowaniem znaków, ale gdzie dokładnie to nie zgadniemy bez kodu albo szklanej kuli :>.

0

Stringi w C# kodowane są w UTF-16, aby przekonwertować do UTF-8 spróbuj zrobić coś takiego:

string twojString;
UTF8Encoding utf8 = new UTF8Encoding();
byte[] encodedBytes = utf8.GetBytes(twojString);
twojString= encodedBytes.ToString();

Albo użyj metody Encoding.Convert().

1

@up - ale ona wczytuje stringi (o dziwnym kodowaniu) ze strony, a nie zapisuje je na stronę...

0

Kod jest na pewno dobrze bo sciaga mi tekst prawidłowo

 try
            {
                WebClient Pobierz = new WebClient();
                string zrodlo = Pobierz.DownloadString("joomla.pl");

                int start = zrodlo.IndexOf("<title>", 0, zrodlo.Length);
                int koniec = zrodlo.IndexOf("</title>", 0, zrodlo.Length);
                string tytuł = zrodlo.Substring(start + 7, koniec - start - 7);
                groupBox1.Text = tytuł;

                int PozycjaArt = zrodlo.IndexOf("</title>", 0);
                string surowy = zrodlo.Substring(PozycjaArt + 22, 500);
                string Art = surowy.Trim();


                label1.Text = Art + "...Kliknij, aby czytać dalej";





            }
            catch
            {
                MessageBox.Show("Nawiązanie połączenia z internetem było nie możliwe");
                Close();
            }
0

No musisz rozpoznać kodowanie tego stringa którego pobierasz (http://stackoverflow.com/questions/1025332/determine-a-strings-encoding-in-c-sharp), później jak już go pobierzesz musisz go przekonwertować do UTF-8 za pomocą metody Encoding.Convert() o której wcześniej pisałem http://msdn.microsoft.com/en-us/library/system.text.encoding.convert.aspx

2

Tak, kod jest na pewno poprawny a błąd to wina chochlików zamieniających bity w karcie sieciowej.

Pobierz.Encoding = Encoding.UTF8;

Przed pobieraniem.

@maze - wyprzedziłeś mnie :>

0

Kocham Was panowie ,jeżeli by jeszcze ktoś odpowiedział by mi na pytanie "a skoro jestesmy już przy IndexOf, to może wiecie co zrobić aby IndexOf wyszukało mi drugi znacznik <title> a nie zaczynał od pierwszego? Po porstu chce zgarnać drugi tytuł ze strony - marta1995 32 minuty temu " byłabym dozgonnie wdziędzna ;)

0
marta1995 napisał(a):

Kocham Was panowie ,jeżeli by jeszcze ktoś odpowiedział by mi na pytanie "a skoro jestesmy już przy IndexOf, to może wiecie co zrobić aby IndexOf wyszukało mi drugi znacznik <title> a nie zaczynał od pierwszego? Po porstu chce zgarnać drugi tytuł ze strony - marta1995 32 minuty temu " byłabym dozgonnie wdziędzna ;)

Może użyj drugi raz IndexOf, tylko ustaw w argumencie początek wyszukiwania na koniec pierwszego title.
Tylko tak jak napisałem - z tego co wiem, title umieszcza się na stronach raz. Po co więcej?

0

no własnie kiepsko, bo ta metoda nie działa, załóżmy, że mamy następujący kod HTML

 
<h1>Moja strona WWW</h1>
<h3>Cześć mam na imię Marta</h3>
<p>Ala ma kota kot ma ale</p>
<h3>Mam 18 lat</h3>
<p>pozdrawiam panów z 4programmers.net/Forum</p>
<h3>Jestem z trójmiasta</h3>
<p>uczę się programować</p>

I teraz zamierzam zgarnąć "Mam 18 lat"

zgodnie z tym co mówiłeś piszę

 
int start = zrodlo.IndexOf("<h3>", 0, zrodlo.Length);
int koniec = zrodlo.IndexOf("</h3>", 0, zrodlo.Length);
string tytuł = zrodlo.Substring(start + 3, koniec - start - 3); // i ta linijka łapie mi pierwszy nagłówek typu h3, ja go nie che, więc powtarzam?
start = zrodlo.IndexOf("</h3>", 0, zrodlo.Length); // a tu jest moja nadzieja ze drugi raz wykożystana funkcja IndexOf przeskoczy mi za nagłówek "Cześć mam na imię Marta"
start = zrodlo.IndexOf("<h3>", 0, zrodlo.Length); // i tutaj rozpocznie szukanie drugiego znacznika <h3>

Jednak ta metoda nie wypala :(

0
 
int start = zrodlo.IndexOf("<h3>", 0, zrodlo.Length);
int koniec = zrodlo.IndexOf("</h3>", 0, zrodlo.Length);
string tytuł = zrodlo.Substring(start + 3, koniec - start - 3); // i ta linijka łapie mi pierwszy nagłówek typu h3, ja go nie che, więc powtarzam?
start = zrodlo.IndexOf("</h3>", 0, zrodlo.Length); // a tu jest moja nadzieja ze drugi raz wykożystana funkcja IndexOf przeskoczy mi za nagłówek "Cześć mam na imię Marta"
start = zrodlo.IndexOf("<h3>", 0, zrodlo.Length); // i tutaj rozpocznie szukanie drugiego znacznika <h3>

Zrób tak:

 
int start = zrodlo.IndexOf("<h3>", 0, zrodlo.Length);
int koniec = zrodlo.IndexOf("</h3>", 0, zrodlo.Length);
start = zrodlo.IndexOf("<h3>", start, zrodlo.Length); 
koniec = zrodlo.IndexOf("</h3>", start, zrodlo.Length);
0

Problem polega wyłącznie na próbie wykorzystania metod bez czytania ich dokumentacji.

start = zrodlo.IndexOf("<h3>", start, zrodlo.Length); 

Czyli zacznij od jakiejś pozycji i przeszukaj tyle znaków ile jest w wejściowym łańcuchu. Od razu widać, że jeżeli start będzie większy od 0, to program się wywali, bo będzie próbował operować na nieistniejących danych.
Kto w ogóle kazał używać tej wersji IndexOf? Dlaczego nie napisać tak:

start = zrodlo.IndexOf("<h3>", start); 

To tak do poczytania: http://msdn.microsoft.com/en-us/library/system.string.indexof.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1