我正在开展一个项目,该项目使用 iPhone/iPad 通过 Microsoft 的 ERP 产品之一与基于 Windows 的 Web 服务进行通信。过程如下:
- 设备向 Web 服务查询数据(例如,客户列表)
- Web 服务查询 ERP 数据库以获取信息
- 将数据格式化为 XML,使用 .NET GZIP 库对 XML 进行压缩,压缩后的数据(字符串)进行 base 64 编码,然后以 XML 消息结构传输回设备
- 设备获取 base 64 编码字符串,使用 GZIP 对其进行解压缩,然后解析 XML
- 解析后的数据存储在 SQLite 中并显示给用户等。
这一切都适用于除国际字符之外的所有内容。例如:
ERP/Windows 发送(可在 ERP、数据库、IE 中保存为 XML 或在记事本中作为 UTF-8 编码文件甚至 ANSI 文件查看): Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ
iOS 作为原始 XML 值: \u201c\u00e4 \u201c\u00f1 \u201c\u00ef \u201c\u00bd \u201c\u00c5 \u201c\u00bb \u201c\u00fb \u201c\u2020 \u201c\u00a3 \u2022\u0152 \u u02c6 \u201c\u008f
iOS 作为 XML 中的显示值: “ä”ñ““Å”»“û”†“£“Œ •^”</p>
我确信这在某种程度上是一个编码的东西,但我已经尝试了所有编码/解码值的方法,但没有运气。XML 通过 .NET 4.0 System.Xml.XmlDocument 类处理并使用 UTF-8。iOS 应该使用 UTF-8 对其进行解码。
值得一提的是,我使用 TBXML 和 GDataXML 来解析 iOS 中的 XML 数据,并且都返回相同的结果。
谁能指出我正确的方向?我能想到的唯一可以分享的相关代码是iOS中高层的解压代码:
+ (NSString*) base64DecodeAndDecompress:(NSString*)compressedString
{
NSData *compressedData = [NSData dataFromBase64String:compressedString];
if(compressedData == nil)
{
return [[NSString alloc] initWithString:@""];
}
NSData *uncompressedData = [QiwiGZIP gunzipData:compressedData];
if(uncompressedData == nil)
{
return [[NSString alloc] initWithString:@""];
}
return [[NSString alloc] initWithData:uncompressedData encoding:NSUTF8StringEncoding];
}