NSString-initWithData:encoding:
メソッドはnil
失敗すると返されるため、変換するエンコーディングが見つかるまで、次々にエンコーディングを試すことができます。これは、すべての文字を正しく変換することを保証するものではありませんが、フィードソースが正しくエンコードされたXMLを送信しない場合は、おそらくそれを使用する必要があります。
基本的な考え方は次のとおりです。
// try the most likely encoding
NSString xmlString = [[NSString alloc] initWithData:xmlData
encoding:NSUTF8StringEncoding];
if (xmlString == nil) {
// try the next likely encoding
xmlString = [[NSString alloc] initWithData:xmlData
encoding:NSWindowsCP1252StringEncoding];
}
if (xmlString == nil) {
// etc...
}
一般的で堅牢にするために、成功するまで次のことを行うことができます。
1.)HTTP応答のContent-Typeヘッダーで指定されたエンコーディングを試してください(存在する場合)
2.)応答データの先頭にバイト順マークがないか確認し、見つかった場合は、示されたエンコードを試してください
3.)最初の2バイトを見てください。空白文字または「<」とnul/zero文字の組み合わせを見つけた場合は、UTF-16を試してください(同様に、最初の4バイトをチェックしてUTF-32があるかどうかを確認できます)
4.)データの先頭をスキャンして<?xml ... ?>
処理命令を探し、encoding='something'
その中を探します。そのエンコーディングを試してください。
5.)いくつかの一般的なエンコーディングを試してください。データソースが英語の場合は、Windows Latin-1、Mac Roman、およびISOLatin-1を必ず確認してください。
6.)上記のいずれも機能しない場合は、127より大きいすべてのバイトを削除して(または「?」または別のASCII文字に置き換えて)、ASCIIエンコーディングを使用してデータを変換してみてください。
この時点でNSStringがない場合は、失敗するはずです。encoding
NSStringがある場合は、処理命令で宣言を探す必要があります<?xml ... ?>
(まだステップ4に行っていない場合)。そこにある場合は、そのエンコーディングを使用してNSStringをNSDataに変換し直す必要があります。そこにない場合は、UTF-8エンコーディングを使用して変換し直す必要があります。
また、CFStringConvertIANACharSetNameToEncoding()
and関数は、ヘッダーまたは処理命令CFStringConvertEncodingToNSStringEncoding()
からエンコード名に対応するNSStringEncodingを取得するのに役立ちます。Content-Type
<?xml ... ?>