将 UTF-8 编码的 NSData 转换为 NSString
我有来自 Windows 服务器的 UTF-8 编码 NSData
,我想将其转换为 iPhone 的 NSString
。由于数据包含在两个平台上具有不同值的字符(如度数符号),如何将数据转换为字符串?
I have UTF-8 encoded NSData
from windows server and I want to convert it to NSString
for iPhone. Since data contains characters (like a degree symbol) which have different values on both platforms, how do I convert data to string?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我谦虚地提交了一个类别,以使这个不那么烦人:
并且
(请注意,如果您不使用 ARC,您将需要一个
autorelease
。)而不是令人震惊的冗长:
现在,您可以这样做,
I humbly submit a category to make this less annoying:
and
(Note that if you're not using ARC you'll need an
autorelease
there.)Now instead of the appallingly verbose:
You can do:
有时,其他答案中的方法不起作用。就我而言,我使用 RSA 私钥生成签名,结果是 NSData。我发现这似乎有效:
Objective-C
Swift
Sometimes, the methods in the other answers don't work. In my case, I'm generating a signature with my RSA private key and the result is NSData. I found that this seems to work:
Objective-C
Swift
从字符串到数据再返回字符串的 Swift 版本:
Xcode 10.1 • Swift 4.2.1
Playground
The Swift version from String to Data and back to String:
Xcode 10.1 • Swift 4.2.1
Playground
总而言之,这是一个对我有用的完整答案。
我的问题是,当我使用时,
我得到的字符串是不可预测的:大约 70% 它确实包含预期值,但往往会导致
Null
甚至更糟:字符串末尾出现垃圾。经过一番挖掘后,我切换到
并每次都得到了预期的结果。
Just to summarize, here's a complete answer, that worked for me.
My problem was that when I used
The string I got was unpredictable: Around 70% it did contain the expected value, but too often it resulted with
Null
or even worse: garbaged at the end of the string.After some digging I switched to
And got the expected result every time.
在 Swift 5 中,您可以使用
String
的 < code>init(data:encoding:) 初始化程序,以便使用 UTF-8 将Data
实例转换为String
实例。init(data:encoding:)
具有以下声明:以下 Playground 代码展示了如何使用它:
With Swift 5, you can use
String
'sinit(data:encoding:)
initializer in order to convert aData
instance into aString
instance using UTF-8.init(data:encoding:)
has the following declaration:The following Playground code shows how to use it:
如果数据不是以 null 结尾,则应使用
-initWithData:encoding:
如果数据以 null 结尾,则应使用
-stringWithUTF8String:
以避免额外的\0
位于末尾。(请注意,如果输入未正确进行 UTF-8 编码,您将得到
nil
。)Swift 变体:
如果数据以 null 结尾,您可以采用安全的方法,即删除空字符,或者类似于上面 Objective-C 版本的不安全方式。
If the data is not null-terminated, you should use
-initWithData:encoding:
If the data is null-terminated, you should instead use
-stringWithUTF8String:
to avoid the extra\0
at the end.(Note that if the input is not properly UTF-8-encoded, you will get
nil
.)Swift variant:
If the data is null-terminated, you could go though the safe way which is remove the that null character, or the unsafe way similar to the Objective-C version above.
你可以调用这个方法
You could call this method