我将文件作为八位字节流发送到服务器,我需要在标题中指定文件名:
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文本。
我的问题是:
答案 0 :(得分:6)
您不能在HTTP标头中使用非ASCII字符,请参阅RFC 2616.URI本身由RFC 2396标准化,也不允许非ASCII。 RFC说:
URI语法的设计具有全局可转录性 其主要关注点。 URI是一个非常的字符序列 有限集,即基本拉丁字母,数字, 和一些特殊的人物。
为了在URI中使用非ASCII字符,您需要使用%hexcode语法来转义它们(请参阅RFC 2396的第2节)。
在Java中,您可以使用java.net.URLEncoder
类来完成此操作。
答案 1 :(得分:1)
实际上,您可以在标题中使用非ASCII字符(请参阅RFC 2616):
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)>
答案 2 :(得分:0)