2017-06-23 47 views
0

在发送来自Swift的HTTP请求之后,我在名为textEncodingName的响应中得到一个字段。如何将字符串(例如“iso-8859-1”)转换为String.Encoding对应字符串?

我想将我收到的data对象转换为包含其内容的字符串,为此,我使用String(data: data!, encoding: .utf8)。这在大多数情况下都适用,因为大多数网站都是UTF-8编码的。但是,例如,https://www.google.co.ukresponse.textEncodingName == "iso-8859-1"

我想其他网站会用更隐晦的编码,所以我的问题是这样的:我怎样才能找到正确的编码,以我的data对象转换为正确的字符串。

回答

2

我发现,将带你从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") 
} 
+0

你有什么想法,会是什么如果编码不被识别会发生? – Zac

+0

@Zac查看我的更新以检查编码是否有效。 – rmaddy

1

我会用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) 
0

在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) 
} 
相关问题