由php编码的一些utf-8字符串base64无法使用iOS base64库进行解码?

时间:2014-04-19 03:36:44

标签: ios base64

这是一段中文utf-8文本,由PHP在服务器端编码,但当我用iOS解码时,它返回null。

我还尝试了this在线工具,可以很好地解码文本。

  NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:content options:0];
  content = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
  

5aW96ZuF77yM5ZKx5p2l5LiA5L + X55qE77yM5pS56Ieq5Lic5Y2X6KW / 5YyX6aOO44CCCuS4juS9oOebuOmAou + 8jOWFqOaYr + acuue8mOW3p + WQiOOAguWPr + Wtpui1t + adpeWNtOW /克+ aGlOaCtOOAggrmgLvmmK / ovpPkuoborqnlho3ljrvlrabvvIzlrabkuobo

以下是使用xcode调试此问题的测试代码:

    NSString * = @"5aW96ZuF77yM5ZKx5p2l5LiA5L+X55qE77yM5pS56Ieq5Lic5Y2X6KW/5YyX6aOO44CCCuS4juS9oOebuOmAou+8jOWFqOaYr+acuue8mOW3p+WQiOOAguWPr+Wtpui1t+adpeWNtOW/g+aGlOaCtOOAggrmgLvmmK/ovpPkuoborqnlho3ljrvlrabvvIzlrabkuobo";

//
    NSData *decodedData = [[NSData alloc] initWithBase64EncodedString: options:0];
    NSString *content = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding] ;

    NSLog(content);

Here is the screen of xcode, and where seems the string have been decoded to NSData , but fail to be converted to utf8 string.

here is the decoded result by online tool

2 个答案:

答案 0 :(得分:3)

您修改过的问题的特点是base64字符串:

  

5aW96ZuF77yM5ZKx5p2l5LiA5L + X55qE77yM5pS56Ieq5Lic5Y2X6KW / 5YyX6aOO44CCCuS4juS9oOebuOmAou + 8jOWFqOaYr + acuue8mOW3p + WQiOOAguWPr + Wtpui1t + adpeWNtOW /克+ aGlOaCtOOAggrmgLvmmK / ovpPkuoborqnlho3ljrvlrabvvIzlrabkuobo

此字符串的长度是四个字节的倍数,因此最后缺少= / ==终结符不是问题。事实上,initWithBase64EncodedString成功解码:

e5a5bde9 9b85efbc 8ce592b1 e69da5e4 b880e4bf 97e79a84 efbc8ce6 94b9e887 
aae4b89c e58d97e8 a5bfe58c 97e9a38e e380820a e4b88ee4 bda0e79b b8e980a2 
efbc8ce5 85a8e698 afe69cba e7bc98e5 b7a7e590 88e38082 e58fafe5 ada6e8b5 
b7e69da5 e58db4e5 bf83e686 94e682b4 e380820a e680bbe6 98afe8be 93e4ba86 
e8aea9e5 868de58e bbe5ada6 efbc8ce5 ada6e4ba 86e8

这里的问题是这似乎不是有效的UTF8字符串。事实上,当我通过您在原始问题中引用的http://base64decode.net站点运行它时,它也无法将其转换为UTF8字符串(我注意到您的屏幕快照正在使用不同的转换器网站)。当我通过another converter运行它时,它转换了它可能的内容,但随后抱怨学了之后的字符(巧合的是,你的base64转换器网站停止的字符也是如此)。 / p>

顺便说一下,的UTF8表示是e4 ba 86。并且您将在基本64字符串的十六进制表示的末尾附近看到,接着是另外一个字节e8。问题是,e8本身并不是有效的UTF8字符。它几乎看起来像是你使用了base64编码的字符串并且只抓住了前200个字节,而忽略了是否导致在中间切断UTF8字符。


原始问题的特色是base64字符串:

  

5aW96ZuF77yM5ZKx5p2l5LiA5L + X55qE77yM5pS56Ieq5Lic5Y2X6KW / 5YyX6aOO44CCCuS4juS9oOebuOmAou + 8jOWFqOaYr + acuue8mOW3p + WQiOOAguWPr + Wtpui1t + adpeWNtOW /克+ aGlOaCtOOAggrmgLvmmK /

这不是有效的base64。它应该是四个字节长度的倍数,但这只是163个字符,缺少一个字符。您的服务器没有正确终止base64字符串,或者由于某种原因它被切断了。

例如,如果我添加一个=来获取最多164个字符,我会得到一个有效的base64字符串:

  

5aW96ZuF77yM5ZKx5p2l5LiA5L + X55qE77yM5pS56Ieq5Lic5Y2X6KW / 5YyX6aOO44CCCuS4juS9oOebuOmAou + 8jOWFqOaYr + acuue8mOW3p + WQiOOAguWPr + Wtpui1t + adpeWNtOW /克+ aGlOaCtOOAggrmgLvmmK / =

如果服务器只是忽略了正确终止base64字符串,那么添加=将是正确的解决方案。无论如何,可以将base64解码为:

好雅,咱来一俗的,改自东南西北风。
与你相逢,全是机缘巧合。可学起来却心憔悴。
总是

那是你所期待的吗?

也许您应该查看服务器上的base64例程?或者,如果它被截断,请查看您如何接收它并将服务器的原始base64字符串长度与此处的字符串进行比较。

有关将===添加到基本64位编码字符串末尾的信息,请参阅the base64 wikipedia page

答案 1 :(得分:1)

@Rob是对的。

选中此检查NSData won't accept valid base64 encoded string

但是如果您的服务器没有返回带有“=”或“==”的有效JSON,那么您需要使用外部方法来执行base64decode。即使base64string在末尾没有“=”符号,这些方法也可以解码。