Как отправить неанглийскую строку юникода, используя HTTP-заголовок? - PullRequest
19 голосов
/ 24 марта 2011

Я новичок в вопросах, связанных с HTTP. Мой вопрос в разработке для iOS, я хотел бы отправить строку, используя заголовок HTTP, поэтому я использую:

[httpRequest setValue:@"nonEnglishString" forHTTPHeaderField:@"customHeader"];

Принимающим сервером является Python (Google App Engine), который сохраняет строковое значение в модели db как StringProperty, используя:

dataEntityInstance.nonEnglishString = unicode(self.request.headers.get('customHeader')

Однако проблема в том, что когда я пытаюсь отправить неанглийскую строку, например, корейскую, она сохраняется в заголовке HTTP следующим образом:

Customheader = "\Uc8fc\Uba39\Uc774 \Uc6b4\Ub2e4";

и когда он получен Google App Engine и сохранен в хранилище данных, он изменяется следующим образом:

??? ??

как будто он не может найти правильные символы для значения Unicode.

НЕ ВОЗМОЖНО или РАЗРЕШЕНО отправлять неанглийские строки с использованием заголовка HTTP?

Если в моей iOS используется только setHTTPBody, он может передавать неанглийские строки и правильно сохранять в хранилище данных App Engine.

[httpRequest setHTTPBody:[httpBody dataUsingEncoding:NSUTF8StringEncoding]];

Но я просто не могу найти правильный путь для достижения той же цели, используя HTTP-заголовки, как, например, то, что делают многие API, такие как Foursquare, и сохраняя строки в правильных формах в хранилище данных Google App Engine на основе Python

Ответы [ 2 ]

23 голосов
/ 25 марта 2011

Разве нельзя или нельзя разрешить отправку неанглийской строки с использованием заголовка HTTP?

В соответствии со стандартами HTTP невозможно поместить символы не-ISO-8859-1 непосредственно взаголовок HTTP.Это дает вам символы ASCII («английский»?) Плюс обычные западноевропейские диакритические знаки.

Однако на практике вы даже не можете использовать расширенные символы ISO-8859-1, поскольку серверы и браузеры не согласны счто делать с не-ASCII символами в заголовках.Safari берет RFC2616 на слове и обрабатывает старшие байты как символы ISO-8859-1;Mozilla использует младшие байты кодовой единицы UTF-16, что аналогично, но более странно;Opera и Chrome декодируют от UTF-8;IE использует локальную системную кодовую страницу.

Таким образом, в действительности все, что вы можете поместить в заголовок HTTP, - это простой ASCII без управляющих кодов.Если вам нужно больше, вам нужно придумать схему кодирования (например, UTF-8 + base64).Стандарт RFC2616 предлагает кодированные слова RFC2047 в качестве стандартной формы кодирования, но это не имеет смысла, учитывая определения того, когда они допустимы в самом RFC2047, и ничто не поддерживает его.

4 голосов
/ 24 марта 2011

В заголовках HTTP можно использовать наборы символов, отличные от ISO 8859-1, но они должны быть закодированы, как описано в RFC 2047 .

...