2009-10-03 8 views
9

Mam aplikację Cocoa, która wywołuje usługę sieci Web. Kiedy parsuję odpowiedź z usługi sieciowej, otrzymuję \ n jako ostatni znak w delegacji foundCharacters dla NSXMLParser dla każdego elementu w XML.NSString isEqualToString: dla n

Kiedy próbuję wykonać następujące czynności:

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

weryfikacja ta nie zawsze złapać przełamane. Ktoś zna dobry sposób na sprawdzanie nowej linii?

Również uważam za dziwne, że każdy element będzie miał znak nowej linii na końcu każdej wartości, mimo że nie widzę na to żadnego dowodu w wynikach usługi internetowej.

To jest problem dla czegoś, co powinno być wyjątkowo łatwe do zrobienia.

+1

Zakładam, że powyższy kod miał być "isEqualToString:", a nie "isStringEqualTo:"? –

+0

Tak, dziękuję, zmieniłem to w pytaniu. –

Odpowiedz

20

Myślę, że to jest właśnie to, czego potrzebujesz?
text = [ciąg tekstowyByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

Pracował jak urok. Tylko z ciekawości, czy ktoś wie, dlaczego tak się dzieje? W prawie każdym innym języku nie musiałbyś wykonywać tego kroku, możesz po prostu zrobić porównanie ciągów na linii nowej, czy też to, w jaki sposób UNIX interpretuje powrót karetki do wiersza, jak wspomniane jaywe? –

+0

Scott Lance: Przeczytaj moją odpowiedź. Wyjaśnia, dlaczego jego komunikat 'isEqualToString:' nie zadziałał zgodnie z oczekiwaniami. –

11

Kiedy analizowania odpowiedzi z usługi internetowej Dostaję \ n jako ostatniego znaku ...

Kiedy próbuję wykonać następujące czynności:

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

Czek będzie zawsze kończy się niepowodzeniem złapać znak nowej linii.

Ta wiadomość będzie tylko powrót YES jeśli string jest długa jeden znak, a znak jest \n.

Jeśli chcesz sprawdzić, czy ciąg kończy\n, następnie trzeba użyć hasSuffix::

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

Jeśli chcesz taśmy\n od końca łańcucha i wykorzystać to, co pozostaje Rozwiązanie Phunehehe jest poprawne.

Edytuj: W odpowiedzi Jeremy'ego W. Shermana, wskazuje on, że usługa sieciowa może wyświetlać tekst zakończony listą CRLF. To jest poprawny punkt i powinieneś nie tylko szukać \n na końcu linii, ale także sprawdzić pełną sekwencję \r\n. Kod, który przedstawia, jest jednym ze sposobów, aby to zrobić. Jednak musisz to zrobić, nadal musisz usunąć cały separator linii, nawet jeśli jest to sekwencja \r\n.

4

Usługa internetowa prawdopodobnie zakończy wszystkie wiersze znakiem CRLF, tj. "\r\n". Jesteś w systemie UNIX, więc znak wprowadzany do linii '\n' jest traktowany jako separator linii; powrót karetki '\r' jest pozostawiony jako część poprzedniej linii. Po wydrukowaniu będzie miał taki sam efekt jak '\n'. Czy zweryfikowaliście (używając, powiedzmy, strvis), że ostateczna postać linii to '\n', a nie '\r'?

-[NSString hasSuffix:] będzie łapał tylko określoną znak nowej linii, który podasz.Aby sprawdzić, czy ciąg kończy się znakiem nowej linii lub spacji, tutaj jest domniemany sposób kategoria:

- (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; 
} 

można wykorzystywać sugestię phunehehe dotyczącą text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] aby usunąć spacje lub znaki nowej linii liniowego ostateczna.

Powiązane problemy