SWIFT:NSURLSession 将数据转换为字符串

2023-12-03

在我的 iPhone 应用程序(在 SWIFT 中开发)中,我必须与 https 服务(带有参数)进行通信,并且需要分析响应。

一切正常,但在某些情况下注意到它没有得到预期的结果...进一步分析我发现这是将服务器响应数据转换为字符串的问题(NSData -> NSString)...

1)。当我使用UTF8编码我得到 nil 作为转换后的字符串(responseString)

    let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)

2)。但与ASCII编码没问题(获取服务器提供的正确响应)

    let responseString = NSString(data: data, encoding: NSASCIIStringEncoding)

以下是我正在尝试的完整示例代码...

    let myUrl = NSURL(string: "https://myurl.com/myservice.asp")
    let request = NSMutableURLRequest(URL: myUrl!)

    request.HTTPMethod = "POST"
    request.timeoutInterval = 55.0
    let postString = "paramone=\(para1)&paramtwo=\(para2)&paramthree=\(para3)"

    // NOTE: Works ok with ASCII AND UTF8 both encoding types at this point...
    // request.HTTPBody = postString.dataUsingEncoding(NSASCIIStringEncoding)
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in

        if (error != nil)
        {
            println("Error: \(error)")
            println("Description: \(error.description)")
            println("Domain     : \(error.domain)")
            println("Error code : \(error.code)")
        }
        else
        {
            //???? => ENCODING PROBLEM
            // let responseString = NSString(data: data, encoding: NSASCIIStringEncoding)
            let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)

            println("Response: \(responseString)")
        }
    }
    task.resume()

我遇到了其他几个POSTS解释同样的问题...但不确定使用 ASCII 而不是 UTF8 是否更好...

另外,我无法理解包含“£”符号的响应,并且可以使用 ASCII 编码正常工作(尽管“£”不在 ASCII 字符集中),但不能使用 UTF8。

想听听我是否遗漏了什么,或者最好的方法是什么……谢谢。


NSASCIIStringEncoding is 记录在案作为严格的 7 位编码 对于 ASCII 值 0 .. 127。然而,实验表明,当decoding NSData to (NS)String,它接受任意数据并且 将字节 0 .. 255 解释为 Unicode 字符 U+0000 .. U+00FF。 所以当decoding, NSASCIIStringEncoding行为相同于NSISOLatin1StringEncoding:

let bytes = (0 ..< 256).map { UInt8($0) }
let data = NSData(bytes: bytes, length: bytes.count)

let s1 = String(data: data, encoding: NSASCIIStringEncoding)!
let s2 = String(data: data, encoding: NSISOLatin1StringEncoding)!
print(s1 == s2) // true

这可以解释为什么像“£”这样的字符即使在 不在 ASCII 字符集中。

但请注意,这种行为(据我所知)没有记录,所以你不应该依赖它。这也不起作用,当encoding (NS)String to NSData:

let d1 = s1.dataUsingEncoding(NSASCIIStringEncoding) // nil

如果服务器发送带有Content-Type = charset=...字段然后您可以自动检测编码, 看https://stackoverflow.com/a/32051684/1187415.

如果服务器没有发送HTTP响应中的响应编码 header 那么你只能尝试不同的编码。经常使用 编码是

  • NSUTF8StringEncoding为了UTF-8编码,
  • NSWindowsCP1252StringEncoding为了Windows-1252编码,
  • NSISOLatin1StringEncoding为了ISO-8859-1编码。

还有一个NSString可以检测所使用的方法 编码,但这要求您首先将数据写入文件, 看将未知编码的TXT文件转换为字符串.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SWIFT:NSURLSession 将数据转换为字符串 的相关文章

  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 使用未解析的标识符“FlurryAdInterstitial”

    我正在尝试整合Flurry Interstitial Ads使用cocoapods in Swift and Xcode 7 1 1 我正在关注开发人员雅虎网站上的此文档 https developer yahoo com flurry d
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • Swift - 元类型 .Type 和 .self 之间有什么区别?

    元类型有什么区别 Type and self在斯威夫特 Do self and Type返回一个struct 我明白那个 self可以用来检查dynamicType 你如何使用 Type 首先也是最重要的是查看 Apple 文档type o
  • UItextView 背景颜色 Linespacing 区域太

    我正在尝试在 UITextView 中复制文本突出显示 不是搜索文本突出显示 但我也被行间距的颜色所困扰 我该如何纠正这个问题 现在的情况 期望的结果 我已将以下属性添加到我的 UiTextview 的属性文本中 对于段落行间距 我使用了以
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • 根据一个数组对多个数组进行排序

    如何根据数组对一堆数组进行排序createdAt 例如 2015 11 02 19 19 35 0000 将它们组合成另一种类型 字典 以便在 tableView 中使用是否有益 如果有的话如何 var comment AnyObject
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 使用 MapKit 的地形和卫星视图

    我是 Mapkit View 的新手 当我给出没有目的地的纬度和经度时 我想显示 MapKit中是否可以通过地形 卫星视图来显示地图 有教程链接吗 我看过一些访问 Google 地图 API html 文件 的示例 有必要吗 或者您可以通过
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • 如何在 UICollectionView 中将行居中?

    我有一个UICollectionView与随机细胞 有什么方法可以让我将行居中吗 默认情况下它是这样的 x x x x x x x x x x x x x x 这是所需的布局 x x x x x x x x x x x x 我必须做这样的事
  • 处理 UICollectionView 中的点击手势

    由于我无法使用任何框架来创建相册 因此我尝试使用 Collection View 创建自己的相册 但我一开始就陷入困境 我的目标是将网络服务中的所有图像显示到我的集合视图中 因为所有图像都已显示 下一步是当有人点击任何单元格时 我可以在新视
  • 为什么 Objective-C 允许在方法定义末尾使用分号? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 实现文件中方法名后面的分号 https stackoverflow com questions 5678360 semicolon after the method name
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐

  • 计算当前时间和下一个事件之间的秒数

    这应该很简单 但事实证明这对我来说具有挑战性 我想知道计算之间的秒数差异的最佳方法 NSDate date 以及从那时起 x 秒后发生的未来事件 有几种不同类型的事件 每个事件可能一天发生几次 并且在不同的时间发生 具体取决于它发生在一周中
  • 检查字符串中是否存在星号

    我必须检查字符串中是否存在星号 但它总是显示没有星号 为什么strpos 不行 我也尝试过stripos mb strpos and mb stripos 没有运气
  • 使用 Firebase ID 令牌对 Firebase 存储进行身份验证

    我希望服务器端的凭据尽可能干净 因此 我使用 Firebase Auth 对自己进行身份验证Firebase 身份验证 Rest Api 从请求中 我获取了 firebase ID 令牌 并使用此令牌向 Firebase 实时数据库发出请求
  • 确保使用 {mongolite} 读取 MongoDB 数据时数据框变为 tibbles

    我必须处理包含嵌套文档的 JSON 文档 并且在某种程度上有一个数组 该数组又包含单个文档 这些文档在概念上会在读取 解析 R 中的 JSON 时映射回 数据帧行 我怎样才能确保所有data frames被铸造成tibbles什么时候 从数
  • 如何发送消息到指定频道 - Discord.js v13 TypeScript

    我最近开始使用 TypeScript 你们都知道 Discord js 最近已迁移到 v13 在此之后 我一直在努力寻找一种使用给定通道 ID 将消息发送到指定通道的方法 这是我当前使用的代码 Define Channel ID const
  • 从 googlechrome 扩展获取页面的源代码

    我正在为 googlechrome 编写一个扩展 以显示网站中的项目列表 我遇到的问题是我无法获取我正在寻找的页面的源代码 当我尝试将其放入 iframe 中时 它的代码会更改窗口的位置 XMLhttpRequest 也只允许在您自己的域中
  • 在 Scala 中,为什么我不能实现这样一个简单的通用函数?

    我想要一个名为 double 的通用函数 其行为如下 可以应用于任何类型def x T T method double A gt AA double 1 gt 2 double 0 2 gt 0 4 所以我这样写这个函数 def doubl
  • 为什么 Pytesseract 无法识别黑底白字?

    我有很多像下面这样的图像 我需要使用 pytesseract 来抓取白色文本 我使用以下代码 但结果并不令人印象深刻 import pytesseract from PIL import Image pytesseract pytesser
  • 分组和连接元组列表

    我有一个对 key val 的列表 其中键和值都是字符串 我想聚合具有重复键的元组 For key1 val1 key2 val2 key3 val3 key1 val4 key2 val5 我要输出 key1 val1 val4 key2
  • 如何将整数编码为其他整数?

    作为后续将 2 个 4 位数字存储在 1 个 8 位数字中 我想知道是否有一个概括 您可以将 n 个 x 位数字存储到 m 个 y 位数字中 例如 也许您可 以将 5 个 8 位数字存储为 3 个 15 位数字 或者可能将 2 个 8 位数
  • 在OpenGL中绘制“点状”形状,与缩放无关

    我正在使用 Qt 和 QWt3D 绘图工具 并扩展它们以提供我需要的一些 3D 和 2D 绘图功能 因此我在此过程中学习了一些 OpenGL 我目前可以使用 OpenGL 绘制点 但只能绘制为圆形 或通过关闭抗锯齿功能绘制为 正方形 这些点
  • Java 不遵循代码? [复制]

    这个问题在这里已经有答案了 这是我认为不遵循代码应该执行的操作的代码片段 public void updateTimeElapsed timeElapsedLabel setText Time elapsed System nanoTime
  • 类成员的使用声明应为成员声明 (C++2003)

    第 7 3 3 段 C 2003 标准指出 类成员的使用声明应为成员声明 这意味着以下给出了语法错误 struct S1 static int var1 using S1 var1 虽然以下编译良好 namespace N2 int var
  • 警告:只有第一个字节会被分配给字符串偏移量

    以下代码在 PHP 7 中运行良好 为什么我在 PHP 8 中看到此警告 str xy str 0 bc 从 PHP 8 开始 尝试使用方数组括号样式替换具有多个字节的字符串偏移量将发出warning 所以你只需要删除多余的字节 c在这种情
  • Restlet - 使用路由器附加资源类时遇到问题

    使用 Restlet 2 1 0 Java SE 版本进行原型设计时 我在将 ServerResource 类映射到 url 时遇到问题 我已经使用 Router attach 方法尝试了很多变体 但没有任何效果 我当前的代码如下所示 pa
  • 按日期分组,当 count() 不产生任何行时为 0

    我正在使用 Postgresql 9 当没有计算行时 我正在与计数和分组作斗争 让我们假设以下架构 create table views date event timestamp with time zone event id intege
  • 如何在代码中进行检查以确保内核模块之间的依赖关系 - Linux Kernel?

    我有两个模块 我希望模块在执行 insmod 或 rmmod 时相互依赖 目前 我的 module2 依赖于 module1 如果我插入 module1 然后 module2 它工作正常 另一方面 反过来则行不通 这在解释上是合乎逻辑的 但
  • 检查 Python 中的字符串是否为“,”的精确形式

    我正在将两个整数组成的字符串转换为一个元组 我需要确保我的字符串的格式完全符合以下形式
  • CountDownTimer - 用户递增。问题

    我有一个关于 CountDownTimer 的问题 我必须制作一个应用程序 允许用户每次单击按钮时将时间时间增加 1 然后 在停止单击按钮后 它会等待三秒钟 然后开始倒计时 我在下面粘贴了我的代码 我的问题是 我似乎无法使数字递增正常工作
  • SWIFT:NSURLSession 将数据转换为字符串

    在我的 iPhone 应用程序 在 SWIFT 中开发 中 我必须与 https 服务 带有参数 进行通信 并且需要分析响应 一切正常 但在某些情况下注意到它没有得到预期的结果 进一步分析我发现这是将服务器响应数据转换为字符串的问题 NSD