如何解决处理未知的UTF8字符
我正在从网站上获取数据。问题是返回的某些字符是问号。如何显示其实际字符而不是问号?
这是我的代码:
URLSession.shared.dataTask(with: request) { data,response,error in
do {
let html = String(decoding: data!,as: UTF8.self)
print(html)
} catch {
//
}
}.resume()
它不会让我使用UTF32.self
之类的东西。
我尝试改用以下代码:
let html = String(data: data!,encoding: .utf8)
完全返回nil
。
解决方法
最后使用了有效的.ascii
:
String(data: data!,encoding: .ascii)
,
当您说“他们的实际角色”时,您认为这些字符是什么(以及为什么您认为这些字符)?我用``问号''表示您的意思是......,它是替换字符。这是当字符不是有效编码时显示的字符。 String(data:encoding:)
返回nil的原因是因为如果编码无效,它将执行此操作。 String(decoding:as:)
用REPLACEMENT CHARACTER替换无效字符,否则将尽其所能。
因此潜在的问题是您要解码的数据不是UTF-8。如果它是“几乎UTF-8”,那么像UTF-32这样的东西将永远无法工作。它们没有有效编码的重叠(NUL除外)。更有可能的是,数据以某种形式的扩展ASCII编码,例如Windows-1251,它编码拉丁语和西里尔字母,并且与拉丁文中的UTF-8兼容,但与西里尔文不兼容。
您需要确定页面的编码是什么,并将该编码与String(data:encoding:)
一起使用。许多编码模棱两可,而扩展的ASCII编码尤其模棱两可,因此无法自动确定它。通常,它会作为标头的一部分返回,但这取决于您要获取的网页。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。