Vraag NSAttributedString initWithHTML onjuiste tekencodering?


-[NSMutableAttributedString initWithHTML:documentAttributes:] lijkt speciale karakters te mangel:

NSString *html = @"“Hello” World"; // notice the smart quotes
NSData *htmlData = [html dataUsingEncoding:NSUTF8StringEncoding];
NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithHTML:htmlData documentAttributes:nil];
NSLog(@"%@", as);

Dat drukt “Hello†World gevolgd door enkele RTF-opdrachten. In mijn toepassing converteer ik de toegewezen tekenreeks naar RTF en geeft deze weer in een NSTextView, maar de personages zijn daar ook corrupt.

Volgens de documentatie is de standaardcodering UTF-8, maar ik probeerde expliciet te zijn en het resultaat is hetzelfde:

NSDictionary *attributes = @{NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]};
NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithHTML:htmlData documentAttributes:&attributes];

17
2018-04-11 18:59


oorsprong


antwoorden:


Gebruik [html dataUsingEncoding:NSUnicodeStringEncoding] bij het maken van de NSData en stel de overeenkomende coderingsoptie in wanneer u de HTML in een toegewezen tekenreeks ontleed:

De documentatie voor NSCharacterEncodingDocumentAttribute is enigszins verwarrend:

NSNumber, met een int die de specificeert NSStringEncoding voor de   het dossier; voor het lezen en schrijven van platte tekstbestanden en het schrijven van HTML;   standaard voor platte tekst is de standaardcodering; standaard voor HTML is   UTF-8.

Dus, je code zou moeten zijn:

NSString *html = @"“Hello” World";
NSData *htmlData = [html dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                    NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)};
NSMutableAttributedString *as =
    [[NSMutableAttributedString alloc] initWithHTML:htmlData
                                            options: options
                                 documentAttributes:nil];

29
2018-04-11 19:42



Het vorige antwoord werkt hier, maar meestal per ongeluk.

Een maken NSData met NSUnicodeStringEncoding zal werken, omdat die constante een alias is NSUTF16StringEncodingen UTF-16 is vrij eenvoudig voor het systeem om te identificeren. Makkelijker dan UTF-8, dat blijkbaar werd geïdentificeerd als een andere superset van ASCII (het lijkt erop NSWindowsCP1252StringEncoding in jouw geval waarschijnlijk omdat het een van de weinige ASCII-gebaseerde coderingen is met toewijzingen voor 0x8_ en 0x9_).

Dat antwoord vergist zich in het citeren van de documentatie voor NSCharacterEncodingDocumentAttribute, omdat "attributen" zijn wat je krijgt uit van -initWithHTML. Dat is waarom het is NSDictionary ** en niet alleen NSDictionary *. U kunt een aanwijzer in een doorgeven NSDictionary *, en je krijgt toetsen als TopMargin / BottomMargin / LeftMargin / RightMargin, PaperSize, DocumentType, UTI, etc. Alle waarden die je probeert te passeren in via het woordenboek "attributen" worden genegeerd.

U moet "opties" gebruiken om waarden door te geven inen de relevante optietoets is NSTextEncodingNameDocumentOption, die geen gedocumenteerde standaardwaarde heeft. Het geeft de bytes door aan WebKit voor het parseren, dus als je geen codering opgeeft, krijg je vermoedelijk WebKit's codering-gissende heuristieken.

Om te garanderen dat de coderingstypes overeenkomen met uw NSData en NSAttributedString, wat je zou moeten doen is zoiets als:

NSString *html = @"“Hello” World";
NSData *htmlData = [html dataUsingEncoding:NSUTF8StringEncoding];

NSMutableAttributedString *as =
    [[NSMutableAttributedString alloc] initWithHTML:htmlData
                                            options:@{NSTextEncodingNameDocumentOption: @"UTF-8"}
                                 documentAttributes:nil];

10
2018-02-19 22:42