Неправильная кодировка при получении ответа от Google translate API? - PullRequest
1 голос
/ 04 августа 2009

Я использую API Google Translate для перевода текста в iPhone SDK. Я использую URL-адрес http://ajax.googleapis.com/ajax/services/language/translate?v=1.0

Все работает, за исключением некоторых языков, например польского, возвращаемая строка иногда содержит странные вещи, такие как \ u0026 как часть строки Было бы показать, как "привет, как ты". Почему это? Я получаю результат следующим образом:

    NSData *returnData = [NSURLConnection sendSynchronousRequest: req returningResponse: response error: error];
    NSString *new = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding];

Кодировка неверна? Поэтому новая строка кажется неверной? Я попробовал тот же текст на веб-странице google translate, и он переведен правильно.


UPDATE

Если вы просто перейдете по этому URL , вы увидите специальные символы. Как правильно представить эти символы в моем приложении? Использование двух приведенных выше строк кода не позволит правильно его кодировать.

Ответы [ 3 ]

3 голосов
/ 12 августа 2009

Пример выглядит правильно:

\u0026quot;liberation\u0026quot; and \u0026quot;exit application\u0026quot;

Я думаю, это jsonEncode(htmlEncode("liberation" and "exit application"))

Если у вас есть подходящая библиотека json, тогда значение translationText должно быть: ..."liberation" and "exit application"..., а затем вам просто нужно передать это через html-декодер.

\uXXXX Экранирование - это просто экранирование в шестнадцатеричном формате Юникода, которое должно обрабатываться парсером json.

0 голосов
/ 13 августа 2009

Ответ является строкой JSON (о JSON здесь ). Попробуйте использовать анализатор JSON для полученной строки, а затем извлеките из нее элемент responseData. Например, используя этот фреймворк , ваш код будет выглядеть так:

// Your original code
NSData *returnData = [NSURLConnection sendSynchronousRequest: req returningResponse: response error: error];
NSString *jsonResponse = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding];
// JSON parsing
SBJsonParser *parser = [SBJsonParser new];
id jsonObject = [parser objectWithString:jsonResponse];
// the result supports key-value coding
NSString* translatedValue = [jsonObject valueForKey:@"responseData"];
0 голосов
/ 04 августа 2009

Забавно, что код Unicode 0026 является символом амперсанда, который также является символом-разделителем параметров в URL-запросах. Это заставляет меня задуматься, не происходит ли что-то с строкой «req» вместо кодировки.

Возможно, захотите взглянуть на ответы на этот вопрос SO Iphone SDk: проблема с амперсандом в строке URL и посмотреть, относится ли это к вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...