Какая кодировка текста используется для значений заголовков в HTTP-запросах?

У меня есть приложение Ruby on Rails, которое является сервером для приложений Java и .Net. У меня есть собственный заголовок, который я использую для отправки некоторых данных, но когда эти данные достигают приложения Ruby on Rails, Rails считывает значение как UTF-8, а затем говорит, что значение не является допустимым UTF- 8 струн.

Например, если я отправлю JÜRGENELITE-HP, я получу:

#<ActiveRecord::StatementInvalid: PGError: ERROR:  invalid byte sequence for encoding "UTF8": 0xdc52
: SELECT * FROM "replicas" WHERE ("replicas"."identification" = 'J?RGENELITE-HP') AND ("replicas".user_id = 121)  LIMIT 1>

Библиотека Java HTTP Client четко и правильно печатает данные в консоли:

DEBUG [main] (DefaultClientConnection.java:268) - >> POST /ze/api/files.json HTTP/1.1
DEBUG [main] (DefaultClientConnection.java:271) - >> X-Replica: JÜRGENELITE-HP
DEBUG [main] (DefaultClientConnection.java:271) - >> Authorization: Basic bWxpbmhhcmVzOjEyMzQ1Njc4

DEBUG [main] (DefaultClientConnection.java:271) - >> Content-Length: 0
DEBUG [main] (DefaultClientConnection.java:271) - >> Host: localhost:3000
DEBUG [main] (DefaultClientConnection.java:271) - >> Connection: Keep-Alive
DEBUG [main] (DefaultClientConnection.java:271) - >> User-Agent: Apache-HttpClient/4.1.2 (java 1.5)

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


person Maurício Linhares    schedule 27.04.2012    source источник
comment
Вы можете использовать решение здесь чтобы обойти то, что вы пытаетесь сделать.   -  person Rob Hruska    schedule 27.04.2012
comment
Здесь также есть несколько хороших ответов.   -  person Rob Hruska    schedule 28.04.2012


Ответы (1)


US-ASCII

Если вы посмотрите на раздел 2.2 RFC2616:

2.2 Основные правила

В этой спецификации используются следующие правила
для описания основных конструкций синтаксического анализа. Набор кодированных символов US-ASCII
определяется стандартом ANSI X3.4-1986 [21].

   OCTET          = <any 8-bit sequence of data>
   CHAR           = <any US-ASCII character (octets 0 - 127)>
   UPALPHA        = <any US-ASCII uppercase letter "A".."Z">
   LOALPHA        = <any US-ASCII lowercase letter "a".."z">
   ALPHA          = UPALPHA | LOALPHA
   DIGIT          = <any US-ASCII digit "0".."9">
   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>
   CR             = <US-ASCII CR, carriage return (13)>
   LF             = <US-ASCII LF, linefeed (10)>
   SP             = <US-ASCII SP, space (32)>
   HT             = <US-ASCII HT, horizontal-tab (9)>
   <">            = <US-ASCII double-quote mark (34)>

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

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

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

TEXT определен еще в разделе 2.2:

   TEXT           = <any OCTET except CTLs,
                    but including LWS>
person Rob Hruska    schedule 27.04.2012