Grails、Tomcat 7、REST 客户端和 UTF-8 字符编码

标签 grails utf-8 character-encoding tomcat7 grails-2.0

我正在尝试将以下字符串“`.4.13 - 30613 £ ₤ © ™”发布到 Grails 服务器,一旦作为 WAR 部署,在 Tomcat7 的两个实例之间进行通信时我没有运气

我们的服务器作为 API 工作,而 Web 层完全独立。数据通过向 Web App 的 POST 请求保存到 DB,然后 Web App 向服务器发送 POST(或 PUT 用于更新)请求以保存数据。

当我使用“Run-App”启动 Web 应用程序和服务器时,这在本地工作正常,但当我们使用 Tomcat7 和部署的 WAR 文件移动到非本地环境时则不然。

最初我认为这可能与报告的错误有关 http://jira.grails.org/browse/GRAILS-8873但是经过仔细检查,似乎无论如何 UTF-8 都是默认值,并且目前正在使用中

非本地环境使用以下结构(在Tomcat7中部署的WAR)

Entry Point -> Apache 2.2 < - > Web App < - > Server

本地环境使用如下结构(Run App)
Entry Point -> Web Abb < - > Server

我在编码到字符串时输出了值,以确保在将其发送到服务器之前,它是正确的编码
DEBUG MarshallService  - Marshalling Property : name of value [ `.4.13 - 30613 £ ? © ™]

这直接来自从 Web App 到服务器的传出请求的日志
忽略内容长度错误的事实,为了可读性,我已经截断了正文。
DEBUG org.apache.http.headers  - >> PUT /baseline-server/baseline/pwqi9tzyTRWX5oZogfKjJw HTTP/1.1
DEBUG org.apache.http.headers  - >> Accept: application/json; charset=utf-8
DEBUG org.apache.http.headers  - >> Content-Length: 349
DEBUG org.apache.http.headers  - >> Content-Type: application/json
DEBUG org.apache.http.headers  - >> Host: localhost:9001
DEBUG org.apache.http.headers  - >> Connection: Keep-Alive
DEBUG org.apache.http.headers  - >> Accept-Encoding: gzip,deflate
DEBUG org.apache.http.wire  - >> "{"name":"`.4.13 - 30613 [0xa3] ? [0xa9] [0x99]"}

我已经阅读了其他几个地方的几个答案并完成了以下操作

在任何 VirtualHost 之前的 Apache 2.2 HTTPD.conf
AddDefaultCharset utf-8

在两个 Tomcat 实例 (Web.xml) 中
<filter>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <async-supported>true</async-supported>
</filter>

此外,根据其他答案,我确保我们使用的是 webxml 1.4.1

然而,当值到达服务器端时,值都是???

我觉得特别奇怪的是传出的 JSON 似乎根本没有显示 UTF-8 字符

任何帮助将不胜感激

最佳答案

我可以建议一些配置尝试....让我知道是否可以解决您的问题:)

你用的是 ubuntu 还是其他 linux?尝试设置

LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
LC_ALL="en_US.UTF-8"

在/etc/default/locale 中并运行
sudo locale-gen

(并重新启动)

您使用的是数据库连接吗?检查 config/dasource.groovy 中的连接是否为 utf8
url = "jdbc:mysql://localhost/?useUnicode=true&characterEncoding=UTF-8"

将此设置放在您的/etc/Config.groovy 中
grails.views.gsp.encoding = "UTF-8"
grails.converters.encoding = "UTF-8"

检查您的 tomcat 连接器是否配置为 utf8
<Connector ... URIEncoding="UTF-8">

关于Grails、Tomcat 7、REST 客户端和 UTF-8 字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15919350/

相关文章:

string - 如何使用 utf8 将 []rune 编码为 []byte

python - 在 Python 中,如何将 8 位二进制数转换为 ASCII 字符?

java - javafxports 项目使用哪种属性文件编码?

grails findAll findAllWhere 不一致

grails - 当应该调整默认的 Grails 缓存设置时,有哪些好的例子?

python - 为什么字符 ID 160 在 PDFMiner 中不被识别为 Unicode?

java - 无法在 Java 中将字符串转换为字节数组,反之亦然

grails - 我可以让 Intellij Idea 10.5 对共享 GSP 模板中的模型变量进行代码完成吗?

tomcat - Grails 应用程序在生产服务器上的首选 Apache Tomcat 版本

java - 使用 Java 调用 SOAP Web 服务时如何修复不可读的 XML 响应?