2014-12-19 3 views
0

создать запрос в Objective C с этим кодом:Как отправить греческие символы с HTTP-сообщением?

NSString *urlBasic = [NSString stringWithFormat:@"http://localhost:8080/belka/Login?"]; 
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[defaults objectForKey:@"userID"], @"userID", @"login", @"login", [defaults objectForKey:@"userName"], @"userName", [defaults objectForKey:@"userFirstName"], @"userFirstName", [defaults objectForKey:@"userLastName"], @"userLastName", nil]; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict 
                 options:NSUTF8StringEncoding 
                 error:&error]; 
NSString *s=[urlBasic stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSURL *url = [NSURL URLWithString:s]; 
dispatch_async(kBgQueue, ^{ 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
     [request setHTTPMethod:@"POST"]; 
     [request setHTTPBody:jsonData]; 
     NSURLResponse *response; 
     NSError *error; 
     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
     if ((data.length > 0) && (error == nil)) { 
      [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:NO]; 
     } 
    }); 

В по умолчанию, USERFIRSTNAME и USERLASTNAME в греческом. Когда я печатаю описание «jsonData», греческие символы в порядке. Когда я распечатать HTTP тело я получаю:

<7b227573 65724669 7273744e 616d6522 3a22ce9c ceb1cebd cf8ccebb ceb7cf82 222c226c 6f67696e 223a226c 6f67696e 222c2275 7365724c 6173744e 616d6522 3a224b61 72616d61 6e697322 2c227573 65724944 223a2231 30313532 38313637 33333732 33313638 222c2275 7365724e 616d6522 3a224d61 6e6f6c69 73204b61 72616d61 6e697322 7d>

После запроса отправляется на стороне сервера, который находится в Java, у меня есть:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    StringBuffer jb = new StringBuffer(); 
    String line = null; 
    try { 
     BufferedReader reader = request.getReader(); 
     while ((line = reader.readLine()) != null) 
      jb.append(line); 
     } catch (Exception e) { /*report an error*/ } 

    try 
    { 
     InitialContext ctx2 = new InitialContext(); 
     UserTransaction utx = (UserTransaction) ctx2.lookup("java:module/UserTransaction"); 
     utx.begin(); 
     JSONObject data = new JSONObject(jb.toString()); 
     String facebookID = data.getString("userID"); 
     String name = data.getString("userFirstName"); 
     String surname = data.getString("userLastName"); 
     String username = data.getString("userName"); 
     System.out.println(name); 
     //and other . . . 
     utx.commit(); 
     response.setCharacterEncoding("UTF-8"); 
     response.getOutputStream().write(name.getBytes()); 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

Проблема заключается в том, что когда я пытаюсь напечатать имя, я получаю это: ÎÎ ± νÏÎ »Î · Ï И это имя отправляется обратно на устройство ios в качестве ответа, которое выглядит так: response =" \ U00ce \ U009c \ U00ce \ U00b1 \ U00ce \ U00bd \ U00cf \ U008c \ U00ce \ U00 бб \ U00ce \ U00b7 \ U00cf \ U0082" ; Любая идея?

ответ

1

Ошибка должна быть в последнем бите цепочки, фрагмент кода, который не показан здесь, который печатает ответ, и это заставляет вас думать, что передача нарушена.

клиент IOS и сервер Java могут понять друг друга, а на самом деле ответ Μανόλης (я не могу говорить по-гречески, но, кажется, текст, который вы искали)

текст, который вы видите ÎανÏÎ»Î·Ï это одна и та же последовательность байтов, интерпретируемая как некоторая 7-битная кодировка (возможно, CP1252, aka Latin 1 или CP1253, греческая кодовая страница, я не могу сказать, потому что, похоже, проблема с шрифтом StackOverflow или, во всяком случае, моя тестовая программа не смог произвести этот вывод)

Here is the program Раньше я анализировал «неправильный» ответ, который вы отправили в конце вашего вопроса

+0

Ответ, который вы упомянули (Μανόλης) - это то, что я хочу. Если байты правильные в каждой части этого вопроса, как я могу напечатать греческие символы, когда захочу? –

+0

Введите код, который вы используете для печати – Raffaele

+0

NSLog (@ "% @", request.HTTPBody.description); (для первой распечатки вопроса). На стороне сервера System.out.println (имя); и я получаю ÎÎ ± νÏÎ »Î · Ï. И ответ в iOS NSLog (@ "% @", response.description); и я получаю ответ = "\ U00ce \ U009c \ U00ce \ U00b1 \ U00ce \ U00bd \ U00cf \ U008c \ U00ce \ U00bb \ U00ce \ U00b7 \ U00cf \ U0082"; –