2

Java および .Net アプリケーション用のサーバーである Ruby on Rails アプリケーションがあります。データを送信するために使用しているカスタム ヘッダーがありますが、このデータが 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 クライアント ライブラリは、データをコンソールに正しく出力します。

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 がヘッダー値をエンコードするために使用するエンコードは何ですか?

4

1 に答える 1

2

US-ASCII

RFC2616のセクション 2.2 を見ると:

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>
于 2012-04-27T19:42:35.083 に答える