ファイルから読み取るときNSString
に使用でき、initWithContentsOfFile:usedEncoding:error:
ファイルのエンコーディングを推測します。
から作成するときNSData
、私の唯一のオプションはinitWithData:encoding:
、エンコーディングを明示的に渡す必要がある場所です。NSData
ファイルの代わりに作業するときに、エンコーディングを確実に推測するにはどうすればよいですか?
ファイルから読み取るときNSString
に使用でき、initWithContentsOfFile:usedEncoding:error:
ファイルのエンコーディングを推測します。
から作成するときNSData
、私の唯一のオプションはinitWithData:encoding:
、エンコーディングを明示的に渡す必要がある場所です。NSData
ファイルの代わりに作業するときに、エンコーディングを確実に推測するにはどうすればよいですか?
iOS 8 および OS X 10.10 には、次の新しい API がありますNSString
。
Objective-C
+ (NSStringEncoding)stringEncodingForData:(NSData *)data
encodingOptions:(NSDictionary *)opts
convertedString:(NSString **)string
usedLossyConversion:(BOOL *)usedLossyConversion;
迅速
open class func stringEncoding(for data: Data,
encodingOptions opts: [StringEncodingDetectionOptionsKey : Any]? = nil,
convertedString string: AutoreleasingUnsafeMutablePointer<NSString?>?,
usedLossyConversion: UnsafeMutablePointer<ObjCBool>?) -> UInt
これで、フレームワークに推測を任せることができます。私の経験では、これは非常にうまく機能します。
ヘッダーから (ドキュメントには現時点でメソッドは記載されていませんが、WWDC セッション 204 (page 270) で公式に言及されています) :
- 推奨される文字列エンコーディングの配列 (このリストの 3 番目のオプションを指定しない場合、すべての文字列エンコーディングが考慮されますが、配列内のエンコーディングが優先されます。さらに、配列内のエンコーディングの順序が重要です。最初のエンコーディングは配列内の 2 番目の優先度より高い優先度)
- 使用しない文字列エンコーディングの配列 (このリストの文字列エンコーディングはまったく考慮されません)
- 提案された文字列エンコーディングのみを考慮するかどうかを示すブール値オプション
- ロッシーが許可されているかどうかを示すブール値のオプション
- ミステリーバイトの置換に特定の文字列を与えるオプション
- 現在のユーザーの言語
- データが Windows によって生成されたかどうかを示すブール値のオプション
ディクショナリ内の値の型が間違っている場合 (たとえば、NSStringEncodingDetectionSuggestedEncodingsKey の値が配列ではない場合)、例外がスローされます。
ディクショナリ内の値が不明な場合 (たとえば、提案された文字列エンコーディングの配列内の値が有効なエンコーディングではない場合)、値は無視されます。
例(スウィフト):
var convertedString: NSString?
let encoding = NSString.stringEncoding(for: data, encodingOptions: nil, convertedString: &convertedString, usedLossyConversion: nil)
デコードされた文字列だけが必要で、エンコーディングを気にしない場合は、削除できますlet encoding =