4

我有一个带引号的可打印字符串,例如“成本为 =C2=A31,000”。如何将其转换为“成本为 1,000 英镑”。

我现在只是手动转换文本,这并不涵盖所有情况。我确信只有一行代码可以帮助解决这个问题。

这是我的代码:

func decodeUTF8(message: String) -> String
{
    var newMessage = message.stringByReplacingOccurrencesOfString("=2E", withString: ".", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=E2=80=A2", withString: "•", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=C2=A3", withString: "£", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=A3", withString: "£", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=E2=80=9C", withString: "\"", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=E2=80=A6", withString: "…", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=E2=80=9D", withString: "\"", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=92", withString: "'", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=3D", withString: "=", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=20", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
    newMessage = newMessage.stringByReplacingOccurrencesOfString("=E2=80=99", withString: "'", options: NSStringCompareOptions.LiteralSearch, range: nil)

    return newMessage
}

谢谢

4

5 回答 5

4
于 2015-09-28T16:22:40.110 回答
1

不幸的是,我的回答有点晚了。不过可能对其他人有帮助。

var string = "The cost would be =C2=A31,000"

var finalString: String? = nil

if let regEx = try? NSRegularExpression(pattern: "={1}?([a-f0-9]{2}?)", options: NSRegularExpressionOptions.CaseInsensitive)
{
    let intermediatePercentEscapedString = regEx.stringByReplacingMatchesInString(string, options: NSMatchingOptions.WithTransparentBounds, range: NSMakeRange(0, string.characters.count), withTemplate: "%$1")
    print(intermediatePercentEscapedString)
    finalString = intermediatePercentEscapedString.stringByRemovingPercentEncoding
    print(finalString)
}
于 2015-10-02T08:16:00.660 回答
0

您还可以查看此工作解决方案 - https://github.com/dunkelstern/QuotedPrintable

let result = QuotedPrintable.decode(string: quoted)
于 2016-07-05T21:33:01.553 回答
0

为了给出一个适用的解决方案,需要更多的信息。所以,我会做一些假设。

例如,在 HTML 或邮件消息中,您可以将一种或多种编码应用于某种源数据。例如,您可以对二进制文件进行编码,例如png使用 base64 的文件,然后将其压缩。顺序很重要。

正如您所说,在您的示例中,源数据是一个字符串,并且已通过 UTF-8 编码。

在一条 HTTPPP 消息中,你Content-Type是这样的text/plain; charset = UTF-8。在您的示例中,似乎还应用了一个附加编码,即“Content-Transfer-Encoding”:可能Content-transfer-encodingquoted-printablebase64(但不确定)。

为了将其还原,您需要以相反的顺序应用相应的解码。

提示

在查看邮件的原始来源时,您可以查看邮件的标头 (Contente-typeContent-Transfer-Encoding)。

于 2015-09-26T11:50:40.517 回答
0

这种编码称为'quoted-printable',您需要做的是使用ASCII编码将字符串转换为NSData,然后只需迭代数据,用字节/字符0xA3替换所有3个符号方,如'=A3',和然后使用 NSUTF8StringEncoding 将结果数据转换为字符串。

于 2015-09-26T11:40:25.523 回答