You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:URLSessionDataTask获取Google返回数据乱码如何解决?

解决iOS中URLSession获取Google搜索结果转正常字符串的问题

问题根源

你遇到的字符串乱码/异常主要来自两个核心原因:

  • 错误使用ASCII编码转换:Google搜索返回的网页内容采用UTF-8编码,用ASCII转换会丢失大量非ASCII字符,直接导致乱码。
  • 未处理响应压缩:Google默认会返回gzip压缩后的内容,直接将压缩数据转字符串必然得到异常内容。

修复方案及代码

关键修复点

  1. 替换编码为UTF-8进行字符串转换
  2. 增加gzip压缩响应的解压逻辑
  3. 设置请求头模拟浏览器请求(避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:27:18