iOS: проблемы с отправкой текста Unicode на сервер

Я столкнулся с очень неприятной проблемой, связанной с текстом Unicode, и я больше ничего не могу сделать, чтобы ее исправить. Я использую следующий код для хранения текстов на английском и японском языках на сервере с iPad.

    __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL: [NSURL URLWithString:url]];
    request.defaultResponseEncoding = NSUTF8StringEncoding;
    [request addRequestHeader:@"Content-Type" value:@"charset=UTF-8;"];

    NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
    [request appendPostData:data];

Странно то, что английский текст (в тех же текстах) прекрасно сохраняется на сервере, но не японский. Они преобразуются в какой-то мусорный текст. Например Когда я UTF8 кодирования в "Это тест フ ロ ン ト ド ア に 表示 さ れ た ア メ ッ ク ス の ス テ ッ カ ー は あ り ま す か" текст, он хранится в виде «Это испытание ム• ãƒãƒ³ãƒãƒ ‰ ã, ¢ 㫠表示㠕 ã ‚ŒãŸã‚¢ãƒ¡ãƒƒã‚¯ã‚¹ã®ã‚¹ãƒ†ãƒƒã‚«ãƒ¼ã¯ã‚ã‚Šã¾ã™ã‹ï¼Ÿ».

Может ли кто-нибудь указать мне, что здесь происходит не так? Спасибо.

[РЕДАКТИРОВАТЬ]

Из документа ASIHTTPRequest,

Sending a form POST with ASIFormDataRequest

To send POST data in a manner compatible with web page forms, use the included. 
ASIFormDataRequest subclass. ***Data is posted in ‘application/x-www-form-urlencoded’ 
format, or ‘multipart/form-data’ format when uploading binary data*** or files. Data in 
files is read as needed from disk, so POSTing large files is OK, as long as your 
web server is setup to handle them.

Поэтому я преобразовал свой код для использования ASIHTTPRequest вместо ASIFormDataRequest, но все равно не повезло!

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL: [NSURL URLWithString:url]];
    [request setDefaultResponseEncoding:NSUTF8StringEncoding];
    [request setRequestMethod:@"POST"];
    [request addRequestHeader:@"Content-Type" value:@"charset=UTF-8;"];

    NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
    [request appendPostData:data];

person AlienMonkeyCoder    schedule 10.09.2012    source источник
comment
Как вы храните текст на сервере? Вы проверили, получил ли сервер текст в UTF8?   -  person rckoenes    schedule 10.09.2012
comment
Из чего состоит ваш сервер, как он его хранит, как проверяете результат?   -  person deceze♦    schedule 10.09.2012
comment
Сервер хранит все, что я отправляю. Перед преобразованием текста в UTF8 я печатаю текст, который, как я уже сказал, подходит. Я конвертирую текст (смесь английского и японского) в UTF8 и отправляю на сервер. Когда я возвращаю тот же текст с сервера, он приходит неправильно! У меня также есть функции на стороне сервера, которые позволяют сохранять тот же текст, и это отлично работает! Поэтому, когда я обновляю текст с самого сервера, iPad получает правильные японские символы, но когда iPad обновляет эти тексты, он начинает возиться! Сервер также использует кодировку UTF8, поэтому не уверен, что происходит!   -  person AlienMonkeyCoder    schedule 10.09.2012
comment
Проблема может быть где угодно между кодированием данных в iOS, их получением и сохранением на сервере, возвратом с сервера и получением на iOS. В какой из этих точек именно вы начинаете видеть мусор?   -  person deceze♦    schedule 10.09.2012
comment
Привет @deceze на стороне сервера все в порядке. iPad абсолютно нормально принимает юникоды, поскольку они доступны на сервере. Проблема начинается, когда iPad отправляет обратно данные Unicode. Короче говоря, iPad, похоже, неправильно кодирует японские символы или сервер не может распознать, что iPad отправил данные UTF8!   -  person AlienMonkeyCoder    schedule 10.09.2012


Ответы (1)


Следующее сработало! У вас должно быть значение = "text/json; charset=utf-8" для типа контента. Просто установить кодировку не получится!!

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL: [NSURL URLWithString:url]];
    [request setDefaultResponseEncoding:NSUTF8StringEncoding];
    [request setRequestMethod:@"post"];
    [request addRequestHeader:@"content-type" value:@"text/json; charset=utf-8"];
person AlienMonkeyCoder    schedule 10.09.2012