2010-12-01 7 views
2

コンテンツの配置ヘッダーからASCIIで表現できないファイル名を取得しようとしています。Objective-CのワードエンコードされたContent-Dispositionヘッダーファイル名のデコード

このファイル名は、ワードエンコードされています。

=?UTF-8?Q = C3 = ABst = C3 = A9_ = C3 = A9_ = C3 = BAm_n = C3 = B4m = C3 = A9→= UTF-8 ?Q?_a = C3 = A7ent = C3 = BAad = C3 = B5.xlsx?=

デコードされたファイル名(実際には "

PS:Objective-Cの実装を探しています。

+0

好きな人のために、私のように:http://en.wikipedia.org/wiki/MIME#Encoded-Word –

+0

このエンコーディングは[Quoted-Printable](http://tools.ietf.org)として知られています。 /html/rfc2045#section-6.7)。 – Gumbo

+0

このヘッダーはウェブ上(HTTPリソース上)に見えましたか?彼らは実際に引用符付きの印刷可能なものを使用すべきではありません... –

答えて

0

おそらく、MIME処理フレームワークを検索したいが、私は

オンラインで検索して何を思い付いたので....私はオンラインの例を見つけることができなかったので、私はちょうど示しますよここでアルゴリズム。私は大きな前提をしているので、これは最良の例ではありません。それは文字列が常にUTF-8でQコード化されていることです。

Qエンコーディングは、FoundationのNSStringが既にデコードをサポートしているURLエンコーディング(パーセントエンコーディング)に似ています。デコード時(エンコード時に大きな違いがあります)の唯一の(実際的な)違いは、%エンコードが=エンコードであることです。

次に、リードインとリードアウトがあります。各符号化ブロックのフォーマットは=?charset-name?encoding-type? ... encoded string here ... ?=です。あなたは本当に文字セット名がそのエンコーディングを使用していることを読んで、 "Q"または "B"(Base64)かもしれないので、エンコーディングタイプを本当に読んでください。

この例は、Qエンコーディング(quoted-printableのサブセット)でのみ機能します。異なる文字セットを扱い、Base64エンコーディングを扱うためには簡単に変更できるはずです。

#import <Foundation/Foundation.h> 

int main(void) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSString *encodedString = @"=?UTF-8?Q?=C3=ABst=C3=A9_=C3=A9_=C3=BAm_n=C3=B4m=C3=A9?= =?UTF-8?Q?_a=C3=A7ent=C3=BAad=C3=B5.xlsx?="; 
    NSScanner *scanner = [NSScanner scannerWithString:encodedString]; 
    NSString *buf = nil; 
    NSMutableString *decodedString = [[NSMutableString alloc] init]; 

    while ([scanner scanString:@"=?UTF-8?Q?" intoString:NULL] 
     || ([scanner scanUpToString:@"=?UTF-8?Q?" intoString:&buf] && [scanner scanString:@"=?UTF-8?Q?" intoString:NULL])) { 
     if (buf != nil) { 
      [decodedString appendString:buf]; 
     } 

     buf = nil; 

     NSString *encodedRange; 

     if (![scanner scanUpToString:@"?=" intoString:&encodedRange]) { 
      break; // Invalid encoding 
     } 

     [scanner scanString:@"?=" intoString:NULL]; // Skip the terminating "?=" 

     // Decode the encoded portion (naively using UTF-8 and assuming it really is Q encoded) 
     // I'm doing this really naively, but it should work 

     // Firstly I'm encoding % signs so I can cheat and turn this into a URL-encoded string, which NSString can decode 
     encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"%" withString:@"=25"]; 

     // Turn this into a URL-encoded string 
     encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"=" withString:@"%"]; 

     // Remove the underscores 
     encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"_" withString:@" "]; 

     [decodedString appendString:[encodedRange stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    } 

    NSLog(@"Decoded string = %@", decodedString); 

    [decodedString release]; 

    [pool drain]; 

    return 0; 
} 

この出力:

chrisbook-プロ:54:42.903 QP-デコード[9643:903]〜クリス・$は 2010-12-01 18 ./qp-decodeデコードされた文字列を=エステéumのノームaçentúadõ.xlsxNSStringのパーセントエスケープを含むトリックを使用して、ここで簡単に/成功した方法を作成しまし

+0

ああ、申し訳ありませんが、私は少し逃した。あなたはまた、すべての "_"(アンダースコア)をスペースで置き換えたいと思っています; – d11wtq

+0

私のコメントごとにコードが修正されました。 – d11wtq

+0

これらの '_'はスペースです([" Q "-encoding](http://tools.ietf.org/html/rfc2047#section-4.2)を参照) – Gumbo

0

私は最近、QエンコーディングまたはBエンコーディングでMIMEエンコードワードをデコードするNSStringカテゴリを実装しました。

コードはGitHubで利用でき、このanswerで簡単に説明します。

関連する問題