我需要在我的Java webapp(servlets + JSP,没有使用框架)中使用UTF-8来支持äöå
等常规芬兰文本和特殊情况下的ЦжФ
等西里尔字母。
我的设置如下:
使用的数据库:MySQL 5.x
用户主要使用Firefox2,但Opera 9.x,FF3,IE7和谷歌浏览器也用于访问该网站。
如何实现这一目标?
答案 0 :(得分:539)
答案 1 :(得分:12)
我认为你在自己的答案中总结得很好。
在端到端的UTF-8-ing(?)过程中,您可能还需要确保java本身使用的是UTF-8。使用-Dfile.encoding = utf-8作为JVM的参数(可以在catalina.bat中配置)。
答案 2 :(得分:11)
要添加到kosoant's answer,如果您使用的是Spring,而不是编写自己的Servlet过滤器,则可以使用它们提供的类org.springframework.web.filter.CharacterEncodingFilter
,在web.xml中对其进行如下配置:
<filter>
<filter-name>encoding-filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>FALSE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
答案 3 :(得分:2)
我还希望从here添加此部分解决了我的问题:
runtime.encoding=<encoding>
答案 4 :(得分:1)
当我们想要使用Java访问它们时,这是MySql表中的希腊语编码:
在JBoss连接池(mysql-ds.xml)中使用以下连接设置
<connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>nts</user-name>
<password>xaxaxa!</password>
<connection-property name="useUnicode">true</connection-property>
<connection-property name="characterEncoding">greek</connection-property>
如果您不想将它放在JNDI连接池中,可以将其配置为JDBC-url,如下一行所示:
jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek
对我和尼克来说,我们永远不会忘记它,浪费时间......
答案 5 :(得分:1)
很好的答案。只是想添加一个肯定会帮助其他人看到URL上的UTF-8编码的东西。
按照以下步骤在firefox中对网址启用UTF-8编码。
在地址栏中输入“about:config”。
使用过滤器输入类型搜索“network.standard-url.encode-query-utf8”属性。
默认情况下,URL上的UTF-8编码适用于IE6 / 7/8和chrome。
答案 6 :(得分:0)
我遇到了类似的问题,但是,在文件的文件名中,我正在使用apache commons进行压缩。 所以,我用这个命令解决了它:
convmv --notest -f cp1252 -t utf8 * -r
对我来说效果很好。希望它对任何人都有帮助;)
答案 7 :(得分:0)
对于我从消息包中显示Unicode字符的情况,我不需要应用“JSP页面编码”部分来在我的jsp页面上显示Unicode。我只需要“CharsetFilter”部分。
答案 8 :(得分:0)
还没有提到的另一点涉及使用Ajax的Java Servlets。我有这样的情况:网页从用户发送utf-8文本发送到JavaScript文件,该文件将其包含在发送给Servlet的URI中。 Servlet查询数据库,捕获结果并将其作为XML返回到格式化的JavaScript文件,并将格式化的响应插入到原始网页中。
在一个Web应用程序中,我遵循了早期的Ajax书中关于在构造URI时包装JavaScript的说明。书中的例子使用了escape()方法,我发现(困难的方法)是错误的。对于utf-8,您必须使用encodeURIComponent()。
这几天似乎很少有人推出自己的Ajax,但我想我也可以添加它。
答案 9 :(得分:0)
关于@kosoant回答中提到的CharsetFilter
....
tomcat Filter
(位于web.xml
)conf/web.xml
中有一个版本。该过滤器名为setCharacterEncodingFilter
,默认情况下已注释。你可以取消注释(请记得取消注释filter-mapping
)
此外,您无需在jsp-config
中设置web.xml
(我已针对Tomcat 7+进行测试)
答案 10 :(得分:0)
有时您可以通过MySQL Administrator向导解决问题。在
启动变量&gt;高级&gt;
并设置Def。 char集:utf8
也许这个配置需要重启MySQL。
答案 11 :(得分:0)
之前的回复并没有解决我的问题。它只在生产中,使用tomcat和apache mod_proxy_ajp。邮政遗体失去了非ascii字符? 问题最终是JVM defaultCharset(默认安装中的US-ASCII:Charset dfset = Charset.defaultCharset();) 所以,解决方案是使用修饰符运行tomcat服务器以UTF-8作为默认字符集运行JVM:
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
(将此行添加到catalina.sh并重新启动服务tomcat)
也许您还必须更改linux系统变量(编辑〜/ .bashrc和〜/ .profile进行永久性更改,请参阅https://perlgeek.de/en/article/set-up-a-clean-utf8-environment)
export LC_ALL = en_US.UTF-8
export LANG = en_US.UTF-8export LANGUAGE = en_US.UTF-8
答案 12 :(得分:0)
在Spring MVC 5 + Tomcat 9 + JSP上遇到了相同的问题。
经过长期的研究,得出了一个优雅的解决方案(不需要,需要过滤器,不需要,需要在Tomcat中进行更改 < strong> server.xml (从8.0.0-RC3版本开始)
在WebMvcConfigurer实现中,为messageSource设置默认编码(用于从消息源文件中以UTF-8编码读取数据。
view:cache
在DispatcherServletInitializer实现中,@ Override onStartup方法并在其中设置请求和资源字符编码。
@Configuration
@EnableWebMvc
@ComponentScan("{package.with.components}")
public class WebApplicationContextConfig implements WebMvcConfigurer {
@Bean
public MessageSource messageSource() {
final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
/* other beans and methods */
}
以UTF-8编码保存所有消息源并查看文件。
在每个*中添加<%@页面contentType =“ text / html; charset = UTF-8”%> 或 <%@页面pageEncoding =“ UTF-8”%> .jsp文件或或将jsp-config描述符添加到web.xml
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
// https://wiki.apache.org/tomcat/FAQ/CharacterEncoding
servletContext.setRequestCharacterEncoding("UTF-8");
servletContext.setResponseCharacterEncoding("UTF-8");
super.onStartup(servletContext);
}
/* servlet mappings, root and web application configs, other methods */
}
答案 13 :(得分:-1)
如果您已在连接池(mysql-ds.xml)中指定,则在Java代码中可以按如下方式打开连接:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
"jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek",
"Myuser", "mypass");