如何将字符串(例如 "iso-8859-1")转换为对应的 String.Encoding?
How can I convert a string, such as "iso-8859-1", to it's String.Encoding counterpart?
从 Swift 发送 HTTP 请求后,我在响应中得到一个名为 textEncodingName
的字段。
我想将我也收到的 data
对象转换为包含其内容的字符串,为此,我使用 String(data: data!, encoding: .utf8)
。这在大多数情况下都有效,因为大多数网站都是 UTF-8 编码的。但是,例如 https://www.google.co.uk
,response.textEncodingName == "iso-8859-1"
.
我想其他网站会使用更晦涩的编码,所以我的问题是:如何找到正确的编码来将我的 data
对象转换为正确的字符串。
我会写一个带有 String
原始值和计算 属性 到 return 适当 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)
您可以简单地尝试 String.Encoding.windowsCP1250
换取 iso-8859-1
。请参考 https://en.wikipedia.org/wiki/Windows-1250
String(data: data, encoding: .windowsCP1250)
或..
我发现了几个步骤,可以将您从 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
的文档:
You can convert this string to a CFStringEncoding value by calling CFStringConvertIANACharSetNameToEncoding(:). You can subsequently convert that value to an NSStringEncoding value by calling CFStringConvertEncodingToNSStringEncoding(:).
这里有一个检查原始文本编码字符串是否有效的更新:
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")
}
在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)
}
在Swift中可以使用:
guard let string = String(data: data, encoding: .isoLatin1) else {return}
guard let perfectData = string.data(using: .utf8, allowLossyConversion: true) else {return}
从 Swift 发送 HTTP 请求后,我在响应中得到一个名为 textEncodingName
的字段。
我想将我也收到的 data
对象转换为包含其内容的字符串,为此,我使用 String(data: data!, encoding: .utf8)
。这在大多数情况下都有效,因为大多数网站都是 UTF-8 编码的。但是,例如 https://www.google.co.uk
,response.textEncodingName == "iso-8859-1"
.
我想其他网站会使用更晦涩的编码,所以我的问题是:如何找到正确的编码来将我的 data
对象转换为正确的字符串。
我会写一个带有 String
原始值和计算 属性 到 return 适当 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)
您可以简单地尝试 String.Encoding.windowsCP1250
换取 iso-8859-1
。请参考 https://en.wikipedia.org/wiki/Windows-1250
String(data: data, encoding: .windowsCP1250)
或..
我发现了几个步骤,可以将您从 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
的文档:
You can convert this string to a CFStringEncoding value by calling CFStringConvertIANACharSetNameToEncoding(:). You can subsequently convert that value to an NSStringEncoding value by calling CFStringConvertEncodingToNSStringEncoding(:).
这里有一个检查原始文本编码字符串是否有效的更新:
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")
}
在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)
}
在Swift中可以使用:
guard let string = String(data: data, encoding: .isoLatin1) else {return}
guard let perfectData = string.data(using: .utf8, allowLossyConversion: true) else {return}