Umlaute in HTML - Fehler

  • Umlaute in HTML - Fehler

    Hallo.

    Ich steh wohl grad voll auf der Leitung, deshalb bitte um Hilfe :)

    Und zwar:

    Quellcode

    1. NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://lyricwiki.org/%@:%@",[artistEsc capitalizedString],[songNameEsc capitalizedString]]];
    2. NSData *data = [NSData dataWithContentsOfURL:url]; //capitalize and percent escaped
    3. NSString *entireHTML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    4. if (entireHTML != nil)
    5. {
    6. NSRange lyricboxRange = [entireHTML rangeOfString:@"<div class='lyricbox' >"];
    7. if (lyricboxRange.location != NSNotFound)
    8. {
    9. NSString *lyricsStr = [entireHTML substringFromIndex:lyricboxRange.location + lyricboxRange.length];
    10. NSRange endBoxRange = [lyricsStr rangeOfString:@"<p><!--"];
    11. if (endBoxRange.location != NSNotFound)
    12. {
    13. lyricsStr = [lyricsStr substringToIndex:endBoxRange.location];
    14. } else //other ending of box
    15. {
    16. endBoxRange = [lyricsStr rangeOfString:@"</div>"];
    17. lyricsStr = [lyricsStr substringToIndex:endBoxRange.location];
    18. }
    19. lyricsStr = [lyricsStr stringByReplacingOccurrencesOfString:@"<br>" withString:@"\n"];
    20. lyricsStr = [lyricsStr stringByReplacingOccurrencesOfString:@"<br />" withString:@"\n"];
    21. lyricsStr = [lyricsStr stringByReplacingOccurrencesOfString:@"<br/>" withString:@"\n"];
    22. [lyrics release];
    23. lyrics = [lyricsStr copy];
    24. }
    25. }
    26. [entireHTML release];
    Alles anzeigen


    so läuft alles blendend, alle Umlaute sind drin. Finde es aber etwas unschön. Würde das gerne mit NSAttributedString machen und mir dann einfach den NSString herausholen, und zwar so:

    Quellcode

    1. NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.lyricwiki.org/Spider%20Murphy%20Gang:Skandal%20Im%20Sperrbezirk"]]; //capitalize and percent escaped
    2. NSString *entireHTML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    3. if (entireHTML != nil)
    4. {
    5. NSRange lyricboxRange = [entireHTML rangeOfString:@"<div class='lyricbox' >"];
    6. if (lyricboxRange.location != NSNotFound)
    7. {
    8. NSString *lyricsStr = [entireHTML substringFromIndex:lyricboxRange.location + lyricboxRange.length];
    9. NSRange endBoxRange = [lyricsStr rangeOfString:@"<p><!--"];
    10. if (endBoxRange.location != NSNotFound)
    11. {
    12. lyricsStr = [lyricsStr substringToIndex:endBoxRange.location];
    13. } else //other ending of box
    14. {
    15. endBoxRange = [lyricsStr rangeOfString:@"</div>"];
    16. lyricsStr = [lyricsStr substringToIndex:endBoxRange.location];
    17. }
    18. data = [lyricsStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    19. NSAttributedString *atstr = [[NSAttributedString alloc] initWithHTML:data baseURL:nil documentAttributes:nil];
    20. lyricsStr = [[[atstr string] retain] autorelease];
    21. [atstr release];
    22. }
    23. }
    24. [entireHTML release];
    Alles anzeigen

    Jetzt enthält auch wieder lyricsStr den HTML string, allerdings sind die Umlaute jetzt "kaputt". also statt ß ist es dann Ä¥ und sowas hässliches...

    Weiß da jemand weiter?

    Herzlichen Dank,
    Matthias
    Matthias Gansrigler | Eternal Storms Software
    Folge mir auf Twitter | Facebook | Blog
  • Hallo Matthias,

    ... die Buben geben Dir kein UTF-8 zurück:

    data = [lyricsStr dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES];


    Dann funktioniert es.

    Frage neben bei:
    Setzt Du echt auf dieses Verfahren? Ich hätte an Deiner Stelle Bedenken.
    Ich finde es auch nicht toll, dass die API weg ist :-/

    Viele Grüße

    2009-08-07 20:30:18.235 xxx[3456:10b] In München steht ein Hofbräuhaus
    Doch Freudenhäuser müssen 'raus
    Damit in dieser schönen Stadt
    Das Laster keine Chance hat
    Doch jeder ist gut informiert
    Weil Rosi täglich inseriert...
  • RE: Umlaute in HTML - Fehler

    Ich vermute, dass Du im zweiten Listing bei der Erzeugung des Attributed Strings das Encoding mitgeben musst. Dazu musst Du die Methode

    Quellcode

    1. - (id)initWithHTML:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict
    verwenden. Für den Options-Parameter nimmst Du ein Dictionary, dass als einen Schlüssel die Konstante NSCharacterEncodingDocumentOption und als Wert UTF-8-Encoding hat.

    Für die genauen Werte schau bitte mal in die Doku.
    „Meine Komplikation hatte eine Komplikation.“
  • Original von macmoonshine
    Original von little_pixel
    ... die Buben geben Dir kein UTF-8 zurück:

    Die Rückgabe der Seite ist UTF-8. Sonst würde auch das erste Beispiel nicht funktionieren.

    Echt?

    Quellcode

    1. Fred:~ chris$ curl http://www.lyricwiki.org/Spider%20Murphy%20Gang:Skandal%20Im%20Sperrbezirk -I
    2. HTTP/1.0 301 Moved Permanently
    3. Date: Fri, 07 Aug 2009 18:42:17 GMT
    4. Server: Apache/2.2.3 (CentOS)
    5. Location: http://lyricwiki.org/Spider%20Murphy%20Gang:Skandal%20Im%20Sperrbezirk
    6. Content-Type: text/html; charset=iso-8859-1
    7. X-Cache: MISS from squid1.lyricwiki.org
    8. X-Cache-Lookup: MISS from squid1.lyricwiki.org:80
    9. Via: 1.0 squid1.lyricwiki.org:80 (squid/2.6.STABLE6)
    10. Connection: close

    Man beachte Zeile 6.

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Reicht Dir die Ausgabe des Web-Developer-Plugins von Firefox als Gegenbeweis?

    ISO-Latin ist ein 1-Byte-Zeichensatz und UTF-8 hat 1 bis 3 Byte pro Zeichen. Das ß wird als zwei Zeichen dargestellt. Das heisst, dass in den Daten zwei Byte für das ß verwendet werden. Bei der Konvertierung in einen String wird aber für jedes Zeichen nur ein Byte erwartet.
    „Meine Komplikation hatte eine Komplikation.“
  • Original von Chris
    Original von macmoonshine
    Original von little_pixel
    ... die Buben geben Dir kein UTF-8 zurück:

    Die Rückgabe der Seite ist UTF-8. Sonst würde auch das erste Beispiel nicht funktionieren.

    Echt?

    Quellcode

    1. Fred:~ chris$ curl http://www.lyricwiki.org/Spider%20Murphy%20Gang:Skandal%20Im%20Sperrbezirk -I
    2. HTTP/1.0 301 Moved Permanently
    3. Date: Fri, 07 Aug 2009 18:42:17 GMT
    4. Server: Apache/2.2.3 (CentOS)
    5. Location: http://lyricwiki.org/Spider%20Murphy%20Gang:Skandal%20Im%20Sperrbezirk
    6. Content-Type: text/html; charset=iso-8859-1
    7. X-Cache: MISS from squid1.lyricwiki.org
    8. X-Cache-Lookup: MISS from squid1.lyricwiki.org:80
    9. Via: 1.0 squid1.lyricwiki.org:80 (squid/2.6.STABLE6)
    10. Connection: close

    Man beachte Zeile 6.

    Chris


    Und besonders beachte Zeilen 2 und 5 ;)
    „Meine Komplikation hatte eine Komplikation.“
  • klar hab ich bedenken dabei. Leicht fällt mir das auf keinen Fall ;)
    Vielleicht drehe ich lyricwiki.org auch komplett ab in GimmeSomeTune, hab ja noch andere Quellen drin...

    Danke für eure Hilfe, hat bestens geklappt (hab das "NSCharacterEncodingDocumentOption" in einem Dictionary angegeben und läuft perfekt).

    Vielen Dank,
    Matthias
    Matthias Gansrigler | Eternal Storms Software
    Folge mir auf Twitter | Facebook | Blog
  • hm. Würde mich interessieren, was Amin dazu sagt.

    Amin, falls du das liest hier:
    lyricwiki.org hatte eine API, die es entwicklern möglich machte, Lyrics aus dem Netz zu holen.
    Diese API wurde von der FCIAA oder wie die heißen gesperrt.
    Jetzt würde ich die HTML Seiten von lyricwiki.org parsen.
    Was sagst du dazu? Krieg ich da Probleme? Wenn ja, womit ist zu rechnen?

    Lieben Dank,
    Matthias
    Matthias Gansrigler | Eternal Storms Software
    Folge mir auf Twitter | Facebook | Blog