如何将字符串(例如“iso-8859-1”)转换为String.Encoding对应字符串?
问题描述:
在发送来自Swift的HTTP请求之后,我在名为textEncodingName
的响应中得到一个字段。如何将字符串(例如“iso-8859-1”)转换为String.Encoding对应字符串?
我想将我收到的data
对象转换为包含其内容的字符串,为此,我使用String(data: data!, encoding: .utf8)
。这在大多数情况下都适用,因为大多数网站都是UTF-8编码的。但是,例如,https://www.google.co.uk
,response.textEncodingName == "iso-8859-1"
。
我想其他网站会用更隐晦的编码,所以我的问题是这样的:我怎样才能找到正确的编码,以我的data
对象转换为正确的字符串。
答
我发现,将带你从textEncodingName
到相应String.Encoding
值几个步骤:
let estr = "iso-8859-1"
let cfe = CFStringConvertIANACharSetNameToEncoding(estr as CFString)
let se = CFStringConvertEncodingToNSStringEncoding(cfe)
let encoding = String.Encoding(rawValue: se)
这主要是基于文档的URLResponse.textEncodingName
:
你可以通过调用CFStringConvertIANACharSetNameToEncoding(:)将此字符串转换为CFStringEncoding值。随后可以通过调用CFStringConvertEncodingToNSStringEncoding( :)将该值转换为NSStringEncoding值。
下面是一个检查,看看是否原文编码字符串是否有效的更新:
let estr = "XXX"
let cfe = CFStringConvertIANACharSetNameToEncoding(estr as CFString)
if cfe != kCFStringEncodingInvalidId {
let se = CFStringConvertEncodingToNSStringEncoding(cfe)
let sse = String.Encoding(rawValue: se)
print("sse = \(sse)")
} else {
print("Invalid")
}
答
我会用String
原始值和一个计算属性编写一个枚举,以返回相应的String.Encoding
值。然后你可以使用它的init(rawValue:)
来创建一个实例。
import Foundation
enum APITextEncoding : String
{
case iso8859_1 = "iso-8859-1"
// etc.
var encoding: String.Encoding
{
switch self
{
case .iso8859_1:
return .isoLatin1
// etc.
}
}
}
let receivedEncoding = APITextEncoding(rawValue: encodingDescription)
let receivedText = String(data: receivedData, encoding: receivedEncoding.encoding)
答
在SWIFT,您可以使用:
func getTextFrom(_ url: URL) -> String? {
guard let data = try? Data(contentsOf: url) else {
return nil
}
return String(data: data, encoding: .utf8) ??
String(data: data, encoding: .isoLatin1)
}
你有什么想法,会是什么如果编码不被识别会发生? – Zac
@Zac查看我的更新以检查编码是否有效。 – rmaddy