0

私は、iPhone/iPad を使用して、Microsoft の ERP 製品の 1 つを介して Windows ベースの Web サービスと通信するプロジェクトに取り組んでいます。プロセスは次のとおりです。

  1. デバイスが Web サービスにデータ (顧客リストなど) を照会します
  2. Web サービスは、ERP データベースに情報を照会します
  3. データは XML にフォーマットされ、XML は .NET GZIP ライブラリを使用して圧縮され、圧縮されたデータ (文字列) は base 64 でエンコードされ、XML メッセージ構造でデバイスに送信されます。
  4. デバイスは Base 64 でエンコードされた文字列を取得し、GZIP を使用して解凍し、XML を解析します
  5. 解析されたデータは 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];
}
4

1 に答える 1

0

これを試して:

NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

XMLParser に渡します。そして、それが機能するかどうかを確認してください。

データを解析できれば。次に、次のように文字を手動で変更する必要があります。

[self replaceOccurrencesOfString:@"&amp;"  withString:@"&"  options:NSLiteralSearch range:NSMakeRange(0, [self length])];
    [self replaceOccurrencesOfString:@"&quot;" withString:@"\"" options:NSLiteralSearch range:NSMakeRange(0, [self length])];

それが役に立てば幸い!!

于 2013-07-31T05:05:46.450 に答える