iOS Read a Stream but returns null - ios

Ok boys and girls, this is my prob :
I'd like to read a JSON stream in my iOS app, but when i tried, it returns
2013-04-12 02:35:01.479 Test[81414:303] (null)
but my file exist and is absolutely not empty !! You can find it here http://api.kalokod.com/cce/mainfeed.json
And my script to read it is :
NSError *error;
NSURL *file = [NSURL URLWithString:#"http://api.kalokod.com/cce/mainfeed.json"];
NSString *string = [NSString stringWithContentsOfURL:file
encoding:NSUTF8StringEncoding
error:&error];
NSLog(#"%#", string);

I tested your code, and received a Cocoa Error 261. This means that the JSON you are trying to load isnt encoded with UTF-8, so using NSUTF8StringEncoding wont work. Try this
NSString *string = [NSString stringWithContentsOfURL:file
encoding:NSASCIIStringEncoding
error:&error];

I suspect this might be your problem -- that there are non-UTF8 characters in your JSON string.
Log your NSError *error to see if you get a Cocoa error 261.

Related

Searching data from txt file in iOS

I have a .txt file in which some data is present, when I stored it in an array I got 50000 words. I want to search the data from text file according to user input and show it on UITableview cell, how is it possible ?
Can any body help me?
Here is my code to read data from .txt file in viewDidLoad:
NSString *filepath = [[NSBundle mainBundle] pathForResource:#"myList" ofType:#"txt"];
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:&error];
if (error)
NSLog(#"Error reading file: %#", error.localizedDescription);
// maybe for debugging...
NSLog(#"contents: %#", fileContents);
NSArray *listArray = [fileContents componentsSeparatedByString:#"\n"];
NSLog(#"items = %d", [listArray count]);
You should use fast enumeration using block. Those are fastest of all for loop iteration. But changing the value in that array at time of enumeration could cause a crash.
Here is a link of how to use block enumeration
Here is a link of how it performance wise.
Hope this helps you!!

How to use stringWithContentsOfFile:usedEncoding:error:

I've tried to load a file with unknown encoding. This is because I dont always have control over the file that I will load. I assumed that the method stringWithContentsOfFile:usedEncoding:error: will do this and will let me know the file encoding. Unfortunately following code doesn't provide the encoding I want - it always return 0.
NSStringEncoding *encoding = nil;
NSError *error = nil;
NSString *json = [NSString stringWithContentsOfFile:path
usedEncoding:encoding
error:&error];
NSLog(#"\n%lu\n%#",(unsigned long)encoding,error);
It returns content of file, so you may wonder why I need this encoding, well that string is JSON that I want to serialize it into NSDictionary and the dataUsingEncoding: method requires encoding. I tried to pass encoding variable but this throws an error. So I tried fail safe UTF8 encoding and then it worked.
NSData *jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
So I must using this incorrect as encoding equals to 0 instead of 4 (UTF8). Can someone help me with that?
Try that :
NSStringEncoding encoding;
NSError *error = nil;
NSString *json = [NSString stringWithContentsOfFile:path
usedEncoding:&encoding
error:&error];
NSLog(#"\n%lu\n%#",(unsigned long)encoding,error);
To be clearer, you can't receive the encoding value in your pointer, you need to give a plain NSStringEncoding address
Since you are not aware of the encoding of the file, I will suggest you to see this link.
Its basically String Programming Guide which will let you know in depth what to do.
Below is the snapshot for which you are looking into:
Hope this will help you. Happy coding :)

How do I parse a csv file?

I'm trying to implement a label that shows me the current location's weather data as the following:
NSString *request = [NSString stringWithFormat:#"http://api.worldweatheronline.com/free/v1/weather.ashx?q=%#&format=csv&num_of_days=0&show_comments=no&key=myKeyThatIRemovedForThisQuestion",city];
NSURL *URL = [NSURL URLWithString:request];
NSError *error;
NSString *csv = [NSString stringWithContentsOfURL:URL encoding:NSASCIIStringEncoding error:&error];
NSArray *items = [csv componentsSeparatedByString:#","];
NSLog(csv);
NSLog([items firstObject]);
NSLog([items objectAtIndex:1]);
The logging line for the csv works.
The logging line for the first object in the array works.
But the objectatindex line throws an unexpected error:
libc++abi.dylib: terminating with uncaught exception of type
NSException
A sample of csv on console:
2014-02-27 21:27:43.626 Clock[1470:70b] 08:28 PM,17,116,http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png,Partly Cloudy ,9,15,100,E,0.2,59,16,1012,75
2014-02-27,18,64,8,46,13,22,169,SSE,263,http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0009_light_rain_showers.png,Patchy light drizzle,3.8
How can I make this thing work so I can get my data from the array?
I've used Dave Delong's CSV parser a few times without issue. This can be found here: https://github.com/davedelong/CHCSVParser
It is also available via CocoaPods as CHCSVParser. This library has a test suite - and works fairly efficiently.

Objective C get html from URL, encoding wrong

I want to ge the html content from the url bellow:
https://bbs.sjtu.edu.cn/file/bbs/mobile/top100.html
The code I have use below:
NSURL *url2 = [NSURL URLWithString:#"http://bbs.sjtu.edu.cn/file/bbs/mobile/top100.html"];
NSString *res = [NSString stringWithContentsOfURL:url2 encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) error:nil];
NSLog(#"%#",res);
the result is null.
I have also tried with UTF8 encoding (also null) and ASCII encoding (has content and the english part of the content is right, but for Chinese charset, the content is garbled).
any one can help about this problem? I have been stuck here for a lot of time.
Try using stringWithContentsOfURL:usedEncoding:error: instead:
NSError *error = nil;
NSStringEncoding encoding;
NSString *my_string = [[NSString alloc] initWithContentsOfURL:url2
usedEncoding:&encoding
error:&error];

Encrypted twitter feed

I'm developing an iOS application , that will take a twits from twitter,
I'm using the following API
https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&count=2&screen_name=TareqAlSuwaidan
The problem are feed in Arabic Language ,
i.e the text feed appears like this
\u0623\u0646\u0643 \u0648\u0627\u0647\u0645
How can i get the real text (or how to encode this to get real text) ?
This is not encrypted, it is unicode. The codes 0600 - 06ff is Arabic. NSString handles unicode.
Here is an example:
NSString *string = #"\u0623\u0646\u0643 \u0648\u0627\u0647\u0645";
NSLog(#"string: '%#'", string);
NSLog output:
string: 'أنك واهم'
The only question is exactly what problem are you seeing, are you getting the Arabic text? Are you using NSJSONSerialization to deserialize the JSON? If so there should be no problem.
Here is an example with the question URL (don't use synchronous requests in production code):
NSURL *url = [NSURL URLWithString:#"https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&count=2&screen_name=TareqAlSuwaidan"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSError *error;
NSArray *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSDictionary *object1 = [jsonObject objectAtIndex:0];
NSString *text = [object1 objectForKey:#"text"];
NSLog(#"text: '%#'", text);
NSLog output:
text: '#Naser_Albdya أيدت الثورة السورية منذ بدايتها وارجع لليوتوب واكتب( سوريا السويدان )
Those are Unicode literals. I think all that's needed is to use NSString's stringWithUTF8String: method on the string you have. That should use NSString's native Unicode handling to convert the literals to the actual characters. Example:
NSString *directFromTwitter = [twitterInterface getTweet];
// directFromTwitter contains "\u0623\u0646\u0643 \u0648\u0627\u0647\u0645"
NSString *encodedString = [NSString stringWithUTF8String:[directFromTwitter UTF8String]];
// encodedString contains "أنك واهم", or something like it
The method call inside the conversion call ([directFromTwitter UTF8String]) is to get access to the raw bytes of the string, that are used by stringWithUTF8String. I'm not exactly sure on what those code points come out to, I just relied on Python to do the conversion.

Resources