Подтвердить что ты не робот

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

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

[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 и сохранен в DataStore, он изменился так:

??? ??

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

Невозможно ли ВОЗМОЖНО или ДОЛЖНО отправлять неанглийскую строку с использованием заголовка HTTP?

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

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

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

4b9b3361

Ответ 1

Невозможно ли ВОЗМОЖНО или ДОЛЖНО отправлять неанглийскую строку с использованием заголовка 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, и ничто не поддерживает его.

Ответ 2

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