Probleme mit dem String-Encoding

  • Probleme mit dem String-Encoding

    Hi Leute,

    hab mal wieder ein Problem, das mich wahsinnig macht.
    Schon mal vorweg, ich programmiere unter OS X 10.3.9

    Mein Programm soll Daten aus einer binären Datei auslesen, die von einem Windosrechner kommt und Text enthält der in ISO Latin 1 kodiert ist.
    Das Einlesen funktioniert so weit auch ganz gut, ich verwende ein NSData-Objekt um die zu laden, hole mir die Daten über [dataObj bytes], caste das ganze auf unsigned char und verarbeite die Daten.

    Jetzt habe ich an einigen Stelle auch mal Sonderzeichen, z.B. Umlaute oder das ß.
    Für ein "ü" kriege ich aber ein ",".
    Hab es dann mit folgendem Code probiert allerdings hat das nichts gebracht.

    Quellcode

    1. NSString* clName = [[[NSString alloc] initWithCString:cName length:clNameLength] autorelease];
    2. NSData* encodedString = [clName dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES];
    3. clName = [[[NSString alloc] initWithData:encodedString encoding:[NSString defaultCStringEncoding]] autorelease];

    Hab ihr vielleicht eine Idee, wie ich das "ü" aus der Datei bekomme?GrußChristian
  • RE: Probleme mit dem String-Encoding

    Versuch mal:

    Quellcode

    1. NSString *s = [NSString stringWithContentsOfFile:@"Mein/Pfad.txt" encoding:NSISOLatin1StringEncoding error:nil]


    Warum legst Du erst einen String an (im Default C-String-Encoding, da wirst Du Probleme mit Umlauten haben), wandelst den dann in ein NSData um, um ihn anschließend wieder in einen String zu wandeln? Bißchen umständlich, oder nicht?

    ciao

    gandhi
  • Das Problem ist, dass sich in der Datei auch andere Daten befinden, nicht nur Text.

    Hab es jetzt so gemacht und es funktioniert. Wahrscheinlich kann er das nicht mehr korrekt konvertieren, nachdem ich das bereits in einen NSString umgewandelt habe.

    Quellcode

    1. clName = [[[NSString alloc] initWithData:[NSData dataWithBytes:&data[pos] length:clNameLength] encoding:NSWindowsCP1252StringEncoding] autorelease];


    Auf jeden Fall ist das "ü" jetzt da.
  • Original von SaniT
    Hab es jetzt so gemacht und es funktioniert. Wahrscheinlich kann er das nicht mehr korrekt konvertieren, nachdem ich das bereits in einen NSString umgewandelt habe.
    Genau so ist es. Bei der ersten Konvertierung mit initWithCString:cName wird alles was >127 ist abgeschnitten - das ist eine implizite NSASCIIStringEncoding. Wenn man dann einen Teil aus dem String herauszieht und den dann konvertieren will muss es schief gehen.

    -- hns