25

-[NSMutableAttributedString initWithHTML:documentAttributes:]特殊文字を台無しにしているようです:

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

“Hello†WorldそれはいくつかのRTFコマンドに続いて印刷されます。私のアプリケーションでは、属性付きの文字列を RTF に変換して で表示しましたNSTextViewが、そこでも文字が壊れています。

ドキュメントによると、デフォルトのエンコーディングは UTF-8 ですが、明示的にしようとしましたが、結果は同じです。

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

3 に答える 3

36

NSData を作成するときに使用[html dataUsingEncoding:NSUnicodeStringEncoding]し、HTML を属性付き文字列に解析するときに一致するエンコード オプションを設定します。

のドキュメントNSCharacterEncodingDocumentAttributeは少し混乱しています:

NSStringEncodingファイルの を指定する int を含む NSNumber 。プレーン テキスト ファイルの読み取りと書き込み、および HTML の書き込み用。プレーン テキストのデフォルトはデフォルトのエンコーディングです。HTML のデフォルトは UTF-8 です。

したがって、コードは次のようになります。

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];
于 2013-04-11T19:42:07.990 に答える
10

ここでの前の回答は機能しますが、ほとんどが偶然です。

その定数は のエイリアスであり、UTF-16 はシステムが識別するのが非常に簡単であるため、 NSDatawithを作成するとNSUnicodeStringEncodingうまくいく傾向があります。NSUTF16StringEncodingどうやらASCIIの他のスーパーセットとして識別されていたUTF-8よりも簡単です(NSWindowsCP1252StringEncodingおそらく、0x8_と0x9_のマッピングを備えた数少ないASCIIベースのエンコーディングの1つであるため、あなたの場合のように見えます)。

NSCharacterEncodingDocumentAttribute「属性」は から得られるものであるため、その答えは のドキュメントを引用する際に間違っています-initWithHTML。だからこそ、それNSDictionary **だけではありませんNSDictionary *。へのポインターを渡すことができ、NSDictionary *TopMargin/BottomMargin/LeftMargin/RightMargin、PaperSize、DocumentType、UTI などのキーを取得します。「属性」辞書を介して渡そうとする値はすべて無視されます

で値を渡すには「オプション」を使用する必要があり、関連するオプション キーはNSTextEncodingNameDocumentOptionであり、ドキュメント化されたデフォルト値はありません。解析のためにバイトを WebKit に渡しているため、エンコーディングを指定しない場合は、おそらく WebKit のエンコーディング推測ヒューリスティックを取得しています。

NSDataとの間でエンコーディング タイプが一致することを保証するにはNSAttributedString、次のようにする必要があります。

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

NSMutableAttributedString *as =
    [[NSMutableAttributedString alloc] initWithHTML:htmlData
                                            options:@{NSTextEncodingNameDocumentOption: @"UTF-8"}
                                 documentAttributes:nil];
于 2014-02-19T22:42:29.543 に答える