9

Webサービスを呼び出すCocoaアプリがあります。Webサービスからの応答を解析すると、XMLの各要素のNSXMLParserのfoundCharactersデリゲートの最後の文字として\nが取得されます。

私が次のことをしようとすると:

if (![string isEqualToString:@"\n"])

チェックは常に改行をキャッチできません。改行を文字列チェックする良い方法を知っている人はいますか?

また、Webサービスからの出力にその証拠が見当たらない場合でも、各要素の各値の末尾に改行が含まれるのは奇妙だと思います。

これは、非常に簡単に実行できるはずの何かにとってはかなりの問題です。

4

3 に答える 3

20

これはあなたが必要なものだと思いますか?
text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

于 2009-10-03T15:42:47.720 に答える
12

Web サービスからの応答を解析すると、最後の文字として \n が表示されます…</p>

次のことをしようとすると:

if (![string isEqualToString:@"\n"])

チェックは常に改行をキャッチできません。

そのメッセージは、が 1 文字の長さで、その文字が のYES場合にのみ返されます。string\n

文字列が で終わる かどうかをテストする場合\nは、次を使用する必要がありますhasSuffix:

if (![string hasSuffix:@"\n"])

文字列の端から剥がして残ったものを使用したい場合は、 phunehehe \nのソリューションが正しいものです。

編集: Jeremy W. Sherman の回答では、Web サービスが CRLF で終了するテキストを提供している可能性があると指摘しています。\nこれは有効なポイントであり、行末を探すだけでなく、完全な\r\nシーケンスも確認する必要があります。彼が提示するコードは、そのための 1 つの方法です。\r\nただし、それがシーケンスであっても、完全な行区切り記号を削除する必要があります。

于 2009-10-03T20:45:29.607 に答える
4

Web サービスは、すべての行をCRLF、つまり で終了している可能性があります"\r\n"。UNIX システムを使用しているため、改行文字'\n'が行区切り文字として使用されます。キャリッジ リターン'\r'は前の行の一部として残されます。印刷すると、 と同じ効果があり'\n'ます。strvis行末の文字が'\n'であり、 ではないことを (たとえば を使用して) 確認しました'\r'か?

-[NSString hasSuffix:]指定した特定の改行文字のみをキャッチします。文字列が改行または空白で終わるかどうかをテストするために、推定カテゴリ メソッドを次に示します。

- (BOOL)my_hasWhitespaceOrNewlineSuffix {
  NSRange r = [self rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]
                                    options:NSBackwardsSearch];
  BOOL foundChar = r.location != NSNotFound;
  BOOL isLineFinal = foundChar && (r.location + r.length == [self length]);
  return isLineFinal;
}

phunehehe の提案を使用して、行末のtext = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]空白または改行を削除できます。

于 2009-10-04T02:02:24.677 に答える