私は、iPhone/iPad を使用して、Microsoft の ERP 製品の 1 つを介して Windows ベースの Web サービスと通信するプロジェクトに取り組んでいます。プロセスは次のとおりです。
- デバイスが Web サービスにデータ (顧客リストなど) を照会します
- Web サービスは、ERP データベースに情報を照会します
- データは XML にフォーマットされ、XML は .NET GZIP ライブラリを使用して圧縮され、圧縮されたデータ (文字列) は base 64 でエンコードされ、XML メッセージ構造でデバイスに送信されます。
- デバイスは Base 64 でエンコードされた文字列を取得し、GZIP を使用して解凍し、XML を解析します
- 解析されたデータは SQLite に保存され、ユーザーなどに表示されます。
これはすべて、国際的な文字を除くすべてにうまく機能します。例えば:
ERP/Windows 送信 (ERP、データベース、XML として保存されている場合は IE、UTF-8 エンコード ファイルおよび ANSI ファイルとしてメモ帳で表示可能) :
生の XML 値としての iOS: \u201c\u00e4 \u201c\u00f1 \u201c\u00ef \u201c\u00bd \u201c\u00c5 \u201c\u00bb \u201c\u00fb \u201c\u2020 \u201c\u00a3 \u201c\u20122\u201c\u201252 u02c6 \u201c\u008f
XML からの表示値としての iOS: “ä “ñ “ï “½ “Å “» “û “† “£ “Œ •ˆ “</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];
}