Im trying to send a string using NSoutputstream , however i cant seem to get the encoding right , using dataWithContentsOfURL works
im using a nodejs TCP server with actionHero library.
it works using netcat and telnet.
- (IBAction)sendText:(id)sender {
NSString *response = [NSString stringWithFormat:#"%#", [_sendTextField.text stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
NSLog(#"writing %#",response);
///////////////////////////// this line works/////////////////////////////////////////////////////
// NSData *data = [[NSData alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:#"http://www.google.com"]]];
///////////////////////////// this line doesnt work/////////////////////////////////////////////////////
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSUTF8StringEncoding]];
//%u returns a non zero value
NSLog(#"%u",[outputStream write:[data bytes] maxLength:[data length]]);
}
i get a null streamError from handle stream Event method
Not knowing the content of response, I can't give you a specific answer as to why NSUTF8StringEncoding doesn't work with it. Generally speaking, however, if there is a byte sequence in your content that is incompatible with UTF-8, you're going to get nil when you call -dataUsingEncoding:.
There's a strategy that I learned from reading Mike Ash's blog (look under the section "Fallbacks"), and it's served me pretty well in situations such as yours.
To briefly sum it up, first try using NSUTF8StringEncoding. If that doesn't work, try using NSISOLatin1StringEncoding. And if that doesn't work, try using NSMacOSRomanStringEncoding. Mike's blog has the rationale for this.
Found the answer to my own question. turns out the problem is in actionHero's on data method where it looks for a /n which is not provided by the ios application. appended a \n and its fine now
Related
In my Mac app I am getting Data from hey JSON web service and one of the fields is an image. When I do a NSLog(#"%#", [dict valueForKeyPath:#"profileImageDataString"] ); I see all of the data and it is correct. And I can also put it in a NSURL object like this NSURL *imgUrl = [dict valueForKeyPath:#"profileImageDataString"]; and it is still correct. But when I try this NSData *imgData = [NSData dataWithContentsOfURL:imgUrl]; or this NSImage *userImage = [[NSImage alloc] initWithContentsOfURL:imgUrl];I get the error unrecognized selector sent to instance. If I put the data in a NSString, two thirds is cut off at the end.
I am trying to save the Image data from the Jason web service into a text file to that later it can be loaded into a NSImage on in a user settings view.
Someone tell me what it is that I'm doing wrong?
This is the value of profileImageDataString that is returned by the web service;
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
The string seems to be a base64 encoded string representation of an image.
Try to create an NSData object from the string and the image from the data.
NSString *imgDataString = [dict objectForKey:#"profileImageDataString"];
NSData *imgData = [[NSData alloc] initWithBase64EncodedString:imgDataString options:0];
NSImage *userImage = [[NSImage alloc] initWithData:imgData];
And I can also put it in a NSURL object like this NSURL *imgUrl = [dict valueForKeyPath:#"profileImageDataString"]; and it is still correct.
You haven't got an NSURL object. You've got an NSString object. Declaring that your pointer refers to an NSURL and using the untyped getter valueForKeyPath: (or, even, much more correctly, objectForKey:) does not change the type of the object.
To convert a string to a URL use +[NSURL URLWithString:]. But what you're showing us isn't a URL. So why try to make it one at all?
But when I try this NSData *imgData = [NSData dataWithContentsOfURL:imgUrl]; or this NSImage *userImage = [[NSImage alloc] initWithContentsOfURL:imgUrl];I get the error unrecognized selector sent to instance.
That's because you're supplying an NSString, which does not implement the same selectors as an NSURL.
If I put the data in a NSString, two thirds is cut off at the end.
No it isn't; however when you log any object, all you get is enough information to help in debugging. Using NSLog is not intended to be a way to store the same amount of data in another form, or indeed to do anything strictly well defined other than help you to debug.
Get your string, use the approach as suggested by vadian.
I get the html source of a page to a NSString like this
NSString* url = #"example url";
NSURL *urlRequest = [NSURL URLWithString:url];
NSError *err = nil;
NSString *response = [NSString stringWithContentsOfURL:urlRequest encoding:kCFStringEncodingUTF8 error:&err];
a part of the response is like : 2 \u00cf\u0083\u00cf\u0087\u00cf\u008c\u00ce\u00bb\u00ce\u00b9\u00ce\u00b1
How can i have the Greek characters shown as they should in the NSString response?
The encoding of the page is "charset=iso-8859-7"
Ahhh, I understand your question a little bit better now.
The Apple-supplied native implementation of NSString doesn't know what to do with iso-8859-7 encoding.
You have two options.
1)
Try requesting different encodings to [NSString stringWithContentsOfURL: encoding: error:] to see if one successfully loads. My first attempt would be with NSISOLatin1StringEncoding.
2)
I found a third party library (and NSString category extension) that does do iso-8859-7 conversion. But to get access to CkoCharset will cost you (or your client) $290 USD. It might be a worthwhile investment to save time & hassle.
https://chilkatsoft.com/charset-objc.asp
and documentation is here:
http://www.chilkatsoft.com/refdoc/objcCkoCharsetRef.html
NSString *stringURL=[[NSString alloc] init];
stringURL=[stringURL stringByAppendingFormat:kSearchBarURL,text.text];
NSString *url = [NSString stringWithString:stringURL];
NSData *data1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSString *responseids = [[NSString alloc] initWithData:data1 encoding:nil];
responseids = [responseids stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:#"\n\r\t"]];
SBJsonParser *parser=[SBJsonParser new];
NSData *data = [parser objectWithString:responseids error:nil];
NSMutableDictionary *searchURL = (NSMutableDictionary*)data;
I coded this i did not handle the exception for my code.
doing json and calling the service url and loading the data.
the application get crashes when my service is too low or no service found.
How to handle the exception for my code here..
Do I use #try #catch.
or
NSURLConnection for error handling.
Please help me out .
Thanks in advance.
Whenever an API makes use of NSError, you should use this rather than wrapping things up in a try…catch block as NSError is designed exactly for this. I usually reserve #try for things where I am really not able to anticipate what might go wrong. If NSError is in the mix, then you know that there is a potential for a problem that you should be handling gracefully.
More generally, your code has some strange stuff in it. You alloc init an empty NSString and then create a new string by appending a format. Not sure why you don't just use [NSString stringWithFormat]. Once you have the string, you can create the URL without the NSString *url bit.
You're also using a synchronous call to what I assume is a remote server. This has the potential to bog down your application if/when the server is not available. You're also not telling NSString what kind of encoding you expect your string to be in when it reads it from NSData. A better method depending on your server side would be to use NSString's stringWithContentsOfURL:usedEncoding:error: method. I would recommend that you use the various NSURLConnection callbacks. Have a look at the URL Loading System Programming Guide on Using NSURLConnection The NSURLConnection delegate methods are the ones you want to implement to provide this asynchronous processing.
For your trimming, you might be interested in the +whitespaceAndNewlineCharacterSet method on NSCharacterSet.
Finally, for your JSON parsing, you might be interested in the category that the SBJSON code adds to NSString, particularly -JSONValue which will give you the dictionary or array representation (as appropriate) of the NSString when parsed as JSON by SBJSON.
HTH
I am trying to get HTML files from the web, using stringWithContentsOfURL:. My problem is, sometimes it works but sometimes it doesn't. For example, I tried:
NSString *string = [NSString stringWithContentsOfURL:
[NSURL URLWithString:#"http://www.google.com/"]
encoding:encoding1
error:nil];
NSLog(#"html = %#",string);
This works fine, but when I replace the URL with #"http://www.youtube.com/" then I only get "NULL". Is there anyone that knows what's going on? Is it because of YouTube having some sort of protection?
Google's home page uses ISO-8859-1 encoding (aka "Latin-1", or NSISOLatin1StringEncoding). YouTube uses UTF-8 (NSUTF8StringEncoding), and the encoding you've specified with your encoding1 variable has to match the web page in question.
If you just want the web page and don't really care what encoding it's in, try this:
NSStringEncoding encoding;
NSError *error;
NSString *string = [NSString stringWithContentsOfURL:
[NSURL URLWithString:#"http://www.google.com/"]
usedEncoding:&encoding
error:&error];
NSLog(#"html = %#",string);
This method will tell you what the encoding was (by writing it to the encoding variable), but you can just throw that away and focus on the string.
I have spent 1 week studying objective C. Now I am quite confused at the dealing with data part.
My friend gave me a link
http://nrj.playsoft.fr/v3/getQuiz.php?udid=23423455&app=2
and ask me write a class to parse this JSON. I had no clue what parsing JSON means. but I have gone online and looked up. I could understand a basics of it and then I impletemented a punch of code to parse this JSON. Which is:
-
(void)parseURL
{
//create new SBJSON object
SBJSON *parser = [[SBJSON alloc] init];
NSError *error = nil;
//perform request from URL
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:#"http://nrj.playsoft.fr/v3/getQuiz.php?udid=23423455&app=2"]];
// Perform request and get JSON back as a NSData object
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
// Get JSON as a NSString from NSData response
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
// parse the JSON response into an object
NSDictionary *results = [parser objectWithString:json_string error:&error];
// array just for the "answer" results
NSArray *quizes = [results objectForKey:#"quiz"];
NSDictionary *firstQuiz = [quizes objectAtIndex:0];
// finally, the name key
NSString *extract = [firstQuiz objectForKey:#"extract"];
NSLog(#"this is: %#", [extract valueForKey:#"extract"]);
}
This is at the implementation file, but in the header file I could not declare any variables, it will print out some errors. I tried to run this, there is no errors, but I am not sure this code is correct or not. And my friend asked me to write a class into an existing project. I don't know what needs to be modified and what not. I am so blur right now. Could anyone pro in this give me a hand. ?
My sincere thanks.
Thanks for reply. I have downloading and added the JSON framework ealier too. I am just not sure where to begin and where to end, meaning the step I should do when I add JSON framework into it. I could understand the syntax but I am not sure about the steps I should do. I am a newbie in this.
If you support iOS 5.0+, you should use built-in NSJSONSerialization.
It is faster than TouchJSON.
You could just use TouchJSON: http://code.google.com/p/touchcode/wiki/TouchJSON
Or you could use this one: http://code.google.com/p/json-framework/
I'm sure there are others. I use TouchJSON... it's fast and has a good API.
I recommend working through Ray Wenderlich's MapKit tutorial, especially if you are a newbie. It covers several common iOS development issues, including parsing JSON data.
http://www.raywenderlich.com/2847/introduction-to-mapkit-on-ios-tutorial
"The Implementation" section is where his JSON feed is retrieved and then in "Plotting the Data" he uses the SBJson library to parse it.