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 将数据转换为字符串 的相关文章

  • NSData initWithBytesNoCopy:length:freeWhenDone 的行为:

    我想要一个固定长度的可变内容共享数据缓冲区 这就是我如何创建它 void buffer malloc length initialize buffer content NSData sharedData NSData alloc initW
  • 在采取行动之前如何知道几个块是否已经执行完毕?

    我在用着animateWithDuration animations completion 之前移动用户界面的几个元素 大约 4 个元素 removeFromSuperview 叫做 我的问题是 我怎么知道在调用之前所有这些动画都已完成re
  • 显示键盘时 Admob 广告不会出现在 UITableView 页脚中

    我用它在 UITableView 的页脚上显示 Admob 广告 UIView tableView UITableView tableView viewForFooterInSection NSInteger section GADBann
  • 将领域列表转换为领域结果

    只是想知道如何将列表转换为结果 因为我正在对区域和区域进行过滤 当用户选择区域时 区域应该仅显示该区域中的那些区域 当我将我的区域分配给定义为的变量时var areas Results area 我得到了编译错误 无法将 列表 类型的值分配
  • Swift SpriteKit 获取可见帧大小

    我一直在尝试使用 Swift 创建一个简单的 SpriteKit 应用程序 目的是让红球在点击时重新定位在屏幕上 但变量 self frame width 和 self frame height 不会返回可见屏幕的边界 相反 它们返回整个屏
  • 如何在 SwiftUI 中动态隐藏导航后退按钮

    我需要暂时地在异步操作期间隐藏视图中的后退按钮 我想防止用户在操作完成之前离开视图 隐藏它是可能的永久使用 navigationBarBackButtonHidden true 但是 显然用户在这种情况下无法返回 因此他们被卡住了 我缺少什
  • 如何创建仅包含静态单元格的集合视图? [复制]

    这个问题在这里已经有答案了 我想添加一个包含 7 个静态单元格的垂直集合视图 我知道如何动态地执行此操作 但我看不出这样做的理由 我必须使用 cellForRow 方法吗 我向我的 viewController 添加了一个集合视图 并添加了
  • ASIHTTP:上传 UIImage?

    有人可以告诉我如何在 Objective c 中使用 ASIHTTPRequest 对象上传 UIImage 对象吗 我需要将其转换为 NSData 对象吗 这是头像上传网址 E g UIImage toUpload UIImage ima
  • 如何制作抗崩溃的ios应用程序

    我现在正在编写 ios 应用程序一段时间 但我的应用程序仍然经常崩溃 并且需要时间才能使它们变得非常稳定 我觉得这很烦人 那么 有没有关于防崩溃编程ios应用程序的编程模式呢 打开编译器警告 删除所有警告 运行静态分析器 删除所有警告 使用
  • 将 NSWindow 的内容变灰

    我有一个NSWindow with 2 NSViews an NSSplitView和一个习惯NSView 访问数据以填充这些视图可能需要一些时间 在此期间 我想将这些视图的内容灰显 我的第一个方法是有一个黑色的第三个NSView覆盖另外2
  • 在 switch 语句中使用 NSString

    是否可以使用NSString in a switch陈述 还是直接使用会更好if else if 我在我的应用程序中使用这些宏 define CASE str if s isEqualToString str define SWITCH s
  • 从 Social.framework(iOS6) 获取 Facebook 访问令牌

    我需要检索我在 设置 应用程序中设置的系统帐户的 Facebook 访问令牌 我知道 Social framework iOS6 知道我所有的 FB 帐户信息 并且我可以使用 SLRequest 类对 Graph API 执行 API 调用
  • iOS 7 故事板本地化与属性标签

    我正在使用 ibtool 从我的所有语言的基本情节提要中生成字符串文件 出于某种原因 ibtool 没有提取UILabel风格为 attributed 我没有这些标签的键 值对 有人知道为什么吗 我最终得出的结论是 使用 ibtool 无法
  • IOS Box2D - 身体遵循基于速度波动的点数组的特定路径

    我有一个关于身体的问题 它遵循特定的路径 首先是将身体移动到目标点的方法 const float destinationControl 0 3f b2Vec2 targetPosition path counter b2Vec2 missi
  • 如何为除用户位置之外的所有点设置自定义注释?

    授权检查后 为了获取用户位置 我调用此 CLLocation 委托函数 func locationManager manager CLLocationManager didUpdateLocations locations CLLocati
  • NSString 的 UTF8String 的 CFString 等价物是什么?

    今天我陷入了僵化状态 因为我无法将一段简单的 ObjC 代码转换为其等效的 Cpp 代码 我有这个 const UInt8 myBuffer NSString aRequest UTF8String 我正在尝试用以下内容替换它 const
  • iOS、Swift 3 - 当我从详细视图返回后单击“取消”时,UISearchBar 消失

    我在containerView中有一个tableView 以编程方式向其添加一个搜索栏 一切工作正常 除了这种情况 当我点击一个单元格时 当 tableView 由 searchBar 过滤时 然后我从明细视图返回 通过推送转场呈现 然后我
  • SwiftUI 多行文本背景颜色

    我在 SwiftUI 中有一个包含多行的文本视图 我知道我可以更改文本的背景颜色 Text
  • 按字符串删除所有重音符号

    surnameField text Fal l opo remove space and apostrophe NSString surnarmeInput surnameField text stringByReplacingOccurr
  • 更改 RealityKit 中 AnchorEntity 的旋转

    我在放置对象 3 秒后将 3d 对象放置到 ARViewController 中 然后我想将对象旋转 90 度 arView scene addAnchor anchorEntity DispatchQueue main asyncAfte

随机推荐

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

    这应该很简单 但事实证明这对我来说具有挑战性 我想知道计算之间的秒数差异的最佳方法 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