iOS开发:URLSessionDataTask获取Google返回数据乱码如何解决?
解决iOS中URLSession获取Google搜索结果转正常字符串的问题
问题根源
你遇到的字符串乱码/异常主要来自两个核心原因:
- 错误使用
ASCII编码转换:Google搜索返回的网页内容采用UTF-8编码,用ASCII转换会丢失大量非ASCII字符,直接导致乱码。 - 未处理响应压缩:Google默认会返回gzip压缩后的内容,直接将压缩数据转字符串必然得到异常内容。
修复方案及代码
关键修复点
- 替换编码为
UTF-8进行字符串转换 - 增加gzip压缩响应的解压逻辑
- 设置请求头模拟浏览器请求(避免Google返回反爬类异常内容)
修改后的完整代码
import Compression let baseURL = "https://www.google.com/search?q=~+%22education%22%20-intitle:%22profiles%22%20-inurl:%22dir/+%22+site:ca.linkedin.com/in/+OR+site:ca.linkedin.com/pub/" if let url = URL(string: baseURL) { var request = URLRequest(url: url) // 模拟浏览器请求头,规避Google反爬策略 request.setValue("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", forHTTPHeaderField: "User-Agent") request.setValue("gzip, deflate", forHTTPHeaderField: "Accept-Encoding") let session = URLSession(configuration: .default) let task = session.dataTask(with: request) { data, response, error in if let error = error { print(error.localizedDescription) return } guard let safeData = data, let httpResponse = response as? HTTPURLResponse else { print("无效的响应数据") return } // 处理gzip压缩的响应数据 var processedData = safeData if let contentEncoding = httpResponse.allHeaderFields["Content-Encoding"] as? String, contentEncoding.contains("gzip") { let stream = OutputStream(toMemory: ()) stream.open() let inputBuffer = [UInt8](safeData) _ = compression_decode_buffer(stream, nil, 0, inputBuffer, inputBuffer.count, COMPRESSION_ZLIB) stream.close() if let decompressedData = stream.property(forKey: .dataWrittenToMemoryStreamKey) as? Data { processedData = decompressedData } } // 用UTF-8编码转换为可读字符串 if let dataString = String(data: processedData, encoding: .utf8) { print(dataString) // 在此处执行你的特定单词/字符序列查找逻辑 } else { print("无法将数据转换为UTF-8格式字符串") } } task.resume() }
补充说明
- 代码中使用iOS系统自带的
Compression框架处理gzip解压,无需引入第三方库 - 模拟浏览器的
User-Agent是必要操作,否则Google可能返回验证码页面或简化版内容,导致后续处理失效
内容的提问来源于stack exchange,提问作者ANDROID_IOS_BIGGENER
相关产品推荐
相关产品推荐

