Java 如何在JAX-RS中设置响应头,以便在自定义生成的文件中正确显示中文字符
如何在Excel文件中正确生成支持汉字编码的“javax.ws.rs.core.Response”(待返回) 为了澄清,我有一个包含一些中文内容的文件(CSV excel),我需要返回一个javax响应,然后在文档中正确显示中文字符(在客户端) 目前我正在做以下工作:Java 如何在JAX-RS中设置响应头,以便在自定义生成的文件中正确显示中文字符,java,rest,character-encoding,response,jax-rs,Java,Rest,Character Encoding,Response,Jax Rs,如何在Excel文件中正确生成支持汉字编码的“javax.ws.rs.core.Response”(待返回) 为了澄清,我有一个包含一些中文内容的文件(CSV excel),我需要返回一个javax响应,然后在文档中正确显示中文字符(在客户端) 目前我正在做以下工作: return Response.status( 200 ) .header( "content-disposition", "attachment;filename=Sample
return Response.status( 200 )
.header( "content-disposition",
"attachment;filename=SampleCSV.csv;charset=Unicode" )
.entity( result )
.build();
但是,当这个响应被构建并返回到客户端(并显示一个弹出屏幕要求下载文件)时,excel文件的中文内容就被粘住了
任何建议都将不胜感激。您指定
charset=Unicode
,这是无效的,因为Unicode不是单一编码。这是一个带有一系列编码的字符集。UTF-8和UTF-16是常用的编码
您可以使用@生成注释来控制响应标题,以影响浏览器/客户端解释响应的方式。对于这是否有效,我看到了不同的观点:
- 在泽西1.12对我很有效
我相当肯定,这只会更改响应头中声明的编码;它不会更改实际用于将响应字符串转换为字节以通过网络发送的编码。这两者必须匹配,否则浏览器/客户端将误解响应,因为它认为您使用了与实际不同的编码
如果返回java.lang.String对象,JAx RS将使用系统默认编码将其转换为字节流。如果JAX-RS服务器在Unix上运行,那么这就是UTF-8,它通常工作得很好,但在Windows上却不是这样
因此,您应该通过将结果对象包装在指定编码的OutputStreamWriter
中,强制它使用特定编码。这将防止JAX-RS使用默认转换
具体来说,如果result
是代码中的java.lang.String对象,则可能需要在其周围创建一个OutputStreamWriter,指定一种编码,如UTF-8,以影响JAX-RS写入网络的字节流。我尚未测试此代码,但它可能会工作:
.entity(new OutputStreamWriter(result, "UTF-8"))
我有了这个,它发送了一个流输出
而不是响应
,并用一个默认的输出流编写器
构建它,它使用系统的默认编码而不是可预测的编码
我想在构造OutputStreamWriter
时指定编码,并在@products
注释中添加了字符集
,这为我解决了这个问题。定义内容处置头的方法没有提到字符集子句
还可以尝试向响应添加适当的内容类型标题:
.header("Content-Type", "text/csv; charset=utf-8")
确保使用utf-8,而不是unicode。如果这样做有效,那么您可以从contentdisposition头中删除charset
子句