【问题标题】:What's the text encoding used for header values on HTTP requests?用于 HTTP 请求的标头值的文本编码是什么?
【发布时间】:2012-05-08 12:45:09
【问题描述】:

我有一个 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 使用什么编码来编码标头值?

【问题讨论】:

标签: ruby-on-rails ruby http encoding ruby-1.8


【解决方案1】:

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-05-16
    • 1970-01-01
    • 2019-03-26
    • 2014-02-13
    • 2011-10-25
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多