Java 在HTTP POST头中发送非ASCII文本

Java 在HTTP POST头中发送非ASCII文本,java,Java,我正在将一个文件作为八位字节流发送到服务器,我需要在标题中指定文件名: String filename = "«úü¡»¿.doc" URL url = new URL("http://www.myurl.com"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.addRequestProperty("Accept", "applica

我正在将一个文件作为八位字节流发送到服务器,我需要在标题中指定文件名:

String filename = "«úü¡»¿.doc"
URL url = new URL("http://www.myurl.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.addRequestProperty("Accept", "application/json; charset=UTF-8");
conn.addRequestProperty("Content-Type", "application/octet-stream; charset=UTF-8");
conn.addRequestProperty("Filename", filename);
// do more stuff here
问题是,我需要发送的某些文件的文件名包含非ASCII字符。我已经读到,您不能在HTTP头中发送非ASCII文本

我的问题是:

  • 您可以在HTTP头中发送非ASCII文本吗
  • 如果可以,你怎么做?当文件名包含非ASCII文本时,上述代码不起作用。服务器响应为“错误请求400”
  • 如果不能,典型的问题是什么 如何绕过这个限制

  • 这可能会有所帮助:

    您不能在HTTP头中使用非ASCII字符,请参阅RFC 2616。URI本身由RFC2396标准化,也不允许非ASCII。RFC说:

    URI语法的设计将全局可转录性作为 它的主要关切。URI是一个非常简单的字符串序列 有限集合,即基本拉丁字母表中的字母、数字、, 还有一些特殊的角色

    为了在URI中使用非ASCII字符,需要使用%hexcode语法对其进行转义(请参阅RFC 2396的第2节)

    在Java中,您可以使用
    Java.net.urlcoder
    类来实现这一点

    2020年编辑:RFC2616已经更新,标题语法的相关部分现在位于

    其中,VCHAR在中定义为“任何可见的[USASCII]字符”。[USASCII]引用为

    [USASCII]     American National Standards Institute, "Coded Character
                  Set -- 7-bit American Standard Code for Information
                  Interchange", ANSI X3.4, 1986.
    

    标准仍然非常明确,HTTP标头仍然仅为US-ASCII

    实际上,您可以在标头中使用非ASCII字符(请参阅):

    消息头=字段名“:“[字段值]
    字段名=令牌
    字段值=*(字段内容| LWS)
    字段内容=
    文本=
    CTL=
    LWS=[CRLF]1*(SP | HT)
    CRLF=CRLF
    CR=
    LF=
    SP=
    HT=
    
    Hmmm,仍然不工作。我做到了:conn.addRequestProperty(“文件名”,urlcoder.encode(文件名));RFC2616的意思是,您只能在HTTP头中使用US-ASCII。其他字符必须进行编码。
    [USASCII]     American National Standards Institute, "Coded Character
                  Set -- 7-bit American Standard Code for Information
                  Interchange", ANSI X3.4, 1986.
    
       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           = <any OCTET except CTLs,
                        but including LWS>
    
       CTL            = <any US-ASCII control character
                        (octets 0 - 31) and DEL (127)>
    
       LWS            = [CRLF] 1*( SP | HT )
    
       CRLF           = CR LF
    
       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)>