如何将字符串(例如“iso-8859-1”)转换为其对应的 String.Encoding?

Posted

技术标签:

【中文标题】如何将字符串(例如“iso-8859-1”)转换为其对应的 String.Encoding?【英文标题】:How can I convert a string, such as "iso-8859-1", to it's String.Encoding counterpart? 【发布时间】:2017-06-23 21:48:26 【问题描述】:

从 Swift 发送 HTTP 请求后,我在响应中得到一个名为 textEncodingName 的字段。

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

我猜其他网站会使用更模糊的编码,所以我的问题是:如何找到正确的编码来将我的 data 对象转换为正确的字符串。

【问题讨论】:

【参考方案1】:

您可以简单地将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 的文档:

您可以通过调用 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")

【讨论】:

你知道如果编码不被识别会发生什么吗? @Zac 查看我的更新以检查编码是否有效。【参考方案2】:

我会编写一个带有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)

【讨论】:

【参考方案3】:

你可以快速使用:

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)

【讨论】:

【参考方案4】:

在 Swift 中你可以使用:

guard let string =  String(data: data, encoding: .isoLatin1) else return

guard let perfectData = string.data(using: .utf8, allowLossyConversion: true) else return

【讨论】:

以上是关于如何将字符串(例如“iso-8859-1”)转换为其对应的 String.Encoding?的主要内容,如果未能解决你的问题,请参考以下文章

如何将汉字转换为iso-8859-1的字符串 - PHP进阶讨论

将组合 diaerese 转换为 ISO 8859-1

使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8

将 ISO-8859-1 转换为 UTF-8 [重复]

如何将带有“(ISO-8859-1)字符的字符串转换为普通(UTF-8)字符?

如何在 Java 中的 ISO-8859-1 和 UTF-8 之间进行转换?