参考文献:ソースコードのコメント、Foundation->NSString(Jump to Definition of NSString)で到達可能
Apple API Reference: CFString Rerence, Working With Encoding
CFStringConvertEncodingToIANACharSetNameを検索
foo.swift
import Foundation
func detectEncoding(data: NSData) -> NSStringEncoding {
return NSString.stringEncodingForData(
data, encodingOptions: nil, convertedString: nil, usedLossyConversion: nil)
}
func encodingNameFromNSStringEncoding(encoding: NSStringEncoding) -> String {
return String(CFStringConvertEncodingToIANACharSetName(
CFStringConvertNSStringEncodingToEncoding(encoding)))
}
let testSet = [NSData(base64EncodedString: "44GT44KT44Gr44Gh44Gv",
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!,
NSData(base64EncodedString: "grGC8YLJgr+CzQ==",
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!,
NSData(base64EncodedString: "pLOk86TLpMGkzw==",
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!]
for data in testSet {
let encoding = detectEncoding(data)
let name = encodingNameFromNSStringEncoding(encoding)
let decoded = NSString(data: data, encoding: encoding)!
print("\(encoding):\(name):\(decoded)")
}
//4:utf-8:こんにちは
//8:cp932:こんにちは
//3:euc-jp:こんにちは
Swift1.2, Swift2.0共にOK!!
(この原稿は書きかけです。)
NSString.stringEncodingメソッドはバイト列(Data)から文字列を生成を試みる事によってエンコードを特定します。どのエンコードでも文字列を生成出来ないと0が返ります。utf-8なら4が返ります。生成を試みる際にあらかじめエンコードの種類が分かっているならそれをメソッドの引数に与えてやることで特定に要するコストを下げる事ができます。
note: ずいぶん長く書きかけで放置してしまった。Swift5.10でも動作する様にしました。
nkf.swift
import Foundation
typealias NSStringEncoding = UInt
func detectEncoding(data: NSData) -> NSStringEncoding {
let encOpt: [StringEncodingDetectionOptionsKey: Any] = [.suggestedEncodingsKey
: [4, 8, 3]]
return NSString.stringEncoding(for:
data as Data, encodingOptions: encOpt, convertedString: nil, usedLossyConversion: nil)
}
func encodingNameFromNSStringEncoding(encoding: NSStringEncoding) -> String {
return String(CFStringConvertEncodingToIANACharSetName(
CFStringConvertNSStringEncodingToEncoding(encoding)))
}
let testSet = [NSData(base64Encoded: "44GT44KT44Gr44Gh44Gv",
options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!,
NSData(base64Encoded: "grGC8YLJgr+CzQ==",
options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!,
NSData(base64Encoded: "pLOk86TLpMGkzw==",
options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)!]
for data in testSet {
let encoding = detectEncoding(data: data)
let name = encodingNameFromNSStringEncoding(encoding: encoding)
let decoded = NSString(data: data as Data, encoding: encoding)!
print("\(encoding):\(name):\(decoded)")
}
//4:utf-8:こんにちは
//8:cp932:こんにちは
//3:euc-jp:こんにちは