【问题标题】:Unable to decode UTF-8 in Obj-C in an analogous way to Java无法以类似于 Java 的方式在 Obj-C 中解码 UTF-8
【发布时间】:2017-12-16 03:48:31
【问题描述】:

我正在从一个经过 base64 编码的服务器接收 http 标头中的数据,并且在解码时遇到问题。我已经将一些现有的 java 代码转换为 Objective-C,并确定 base 64 解码问题的原因是由于 java 和 Objective-C 之间的 UTF-8 解码结果不同。这是一个复制java转换的java sn-p:

import java.util.Base64;
public class HelloWorld{
     public static void main(String []args){
        System.out.println("Hello World");
        try {
            String s = "t%2BX";
            System.out.println(s);
            String utfDecoded = java.net.URLDecoder.decode(s, "UTF-8");
             System.out.println("Decoded UTF");
            System.out.println(utfDecoded);
            byte[] b = Base64.getDecoder().decode(utfDecoded);
             System.out.println("Decoded bytes");
            System.out.println(b);
        } catch(Exception e)  {
              System.out.println("exception");
       }
     }
}

运行原字符串时,解码后的字符串输出为:

t%2BX
t+X

现在这是我的 Obj-C 代码:

NSString* utf8EncodedString = @"t%2BX";
const char *cString = [utf8EncodedString cStringUsingEncoding:NSISOLatin1StringEncoding];
NSString *decodedUTF8 = [NSString stringWithCString: cString encoding:NSUTF8StringEncoding];
NSLog(utf8EncodedString);
NSLog(decodedUTF8);
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:decodedUTF8 options: 0];

运行时,decodedData 为 nil,这意味着 initWithBase64EncodedString 认为输入不是有效的 base54 编码,控制台中的输出是:

t2BX

t2X

如何正确解码 UTF-8 数据,以便将其提供给 initWithBase64EncodedString?

(这不是正在解码的完整实际字符串,但我已将问题缩小到导致对 initWithBase64EncodedString 的调用为零的一小部分)。

(不是填充问题NSData won't accept valid base64 encoded string

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    您的字符串采用 UTF8 格式并具有 URL 编码。您需要使用NSStringstringByRemovingPercentEncoding 方法,就像在Java 中使用URLDecoder 一样。无需使用中间 C 字符串。高温

    【讨论】:

      【解决方案2】:

      让 CRD 的答案更进一步,这里是代码

      NSString* utf8EncodedString = @"t%2BX";
      NSString* decodedUTF8 = [utf8EncodedString stringByRemovingPercentEncoding];
      NSLog(@"%@", utf8EncodedString);
      NSLog(@"%@", decodedUTF8);
      NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:decodedUTF8 options: 0];
      

      会输出

      t%2BX
      t+X
      

      【讨论】:

        猜你喜欢
        • 2011-01-01
        • 2015-07-19
        • 2019-03-05
        • 1970-01-01
        • 2021-03-22
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2018-04-22
        相关资源
        最近更新 更多