如何在从MySQL(JDBC,JSP)中显示文本时设置UTF-8编码。

huangapple go评论111阅读模式
英文:

How to set UTF-8 encoding when displaying text from MySQL (JDBC,JSP)

问题

  1. 我在寻找解决这个编码问题的方法。我尝试了互联网/论坛上找到的几种替代方法,但似乎都没有起作用。
  2. **Connection类**
  3. ```java
  4. public class ConnectionFactory {
  5. public Connection getConnection() {
  6. try {
  7. try {
  8. Class.forName("com.mysql.cj.jdbc.Driver");
  9. } catch (ClassNotFoundException e) {
  10. e.printStackTrace();
  11. }
  12. return DriverManager.getConnection("jdbc:mysql://localhost/fj21?useTimezone=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8", "root", "");
  13. } catch (SQLException e) {
  14. throw new RuntimeException(e);
  15. }
  16. }
  17. }

在我的JSP页面中,我使用了以下指令:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

在“my.cnf”文件中,我添加了以下内容:

  1. [client]
  2. default-character-set = utf8mb4
  3. [mysql]
  4. default-character-set = utf8mb4
  5. [mysld]
  6. default-character-set = utf8mb4
  7. collation-server = utf8mb4_unicode_ci
  8. init-connect = 'SET NAMES utf8mb4'
  9. character-set-server = utf8mb4
  10. character-set-database = utf8mb4

我的MySQL变量如下:

  1. mysql> show variables like '%char%';
  2. +--------------------------+---------------------------------------------------------+
  3. | Variable_name | Value |
  4. +--------------------------+---------------------------------------------------------+
  5. | character_set_client | utf8 |
  6. | character_set_connection | utf8 |
  7. | character_set_database | utf8mb4 |
  8. | character_set_filesystem | binary |
  9. | character_set_results | utf8 |
  10. | character_set_server | utf8mb4 |
  11. | character_set_system | utf8 |
  12. | character_sets_dir | /usr/local/mysql-5.6.34-osx10.11-x86_64/share/charsets/ |
  13. +--------------------------+---------------------------------------------------------+
  14. mysql> show variables like '%coll%';
  15. +----------------------+--------------------+
  16. | Variable_name | Value |
  17. +----------------------+--------------------+
  18. | collation_connection | utf8_general_ci |
  19. | collation_database | utf8mb4_general_ci |
  20. | collation_server | utf8mb4_general_ci |
  21. +----------------------+--------------------+

但是记录中仍然没有得到正确的字符(“ç”,“ã”,“á”等):

  1. +----+----------------------+----------------------------+--------------------------------+----------------+
  2. | id | name | email | address | dataNascimento |
  3. +----+----------------------+----------------------------+--------------------------------+----------------+
  4. | 25 | Concei&#195;&#167;&#195;&#163;o | con@email | Rua Concei&#195;&#167;&#195;&#163;o, 1 | 2020-10-04 |
  5. +----+----------------------+----------------------------+--------------------------------+----------------+

我漏掉了什么?...
如何在从MySQL(JDBC,JSP)中显示文本时设置UTF-8编码。

  1. <details>
  2. <summary>英文:</summary>
  3. I&#39;m struggling to find a solution to this encoding problem. I tried several alternatives found on the Internet/forums, but none of them seems to work.
  4. **Connection class**
  5. public class ConnectionFactory {
  6. public Connection getConnection() {
  7. try {
  8. try {
  9. Class.forName(&quot;com.mysql.cj.jdbc.Driver&quot;);
  10. } catch (ClassNotFoundException e) {
  11. e.printStackTrace();
  12. }
  13. return DriverManager.getConnection(&quot;jdbc:mysql://localhost/fj21?useTimezone=true&amp;serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&quot;, &quot;root&quot;, &quot;&quot;);
  14. } catch (SQLException e) {
  15. throw new RuntimeException(e);
  16. }
  17. }
  18. }
  19. **On my JSP page I&#39;m using the instructions:**
  20. &lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
  21. pageEncoding=&quot;UTF-8&quot;%&gt;
  22. **In &quot;my.cnf&quot; file I added:**
  23. [client]
  24. default-character-set = utf8mb4
  25. [mysql]
  26. default-character-set = utf8mb4
  27. [mysld]
  28. default-character-set = utf8mb4
  29. collation-server = utf8mb4_unicode_ci
  30. init-connect = &#39;SET NAMES utf8mb4&#39;
  31. character-set-server = utf8mb4
  32. character-set-database = utf8mb4
  33. **My MySQL variables are:**
  34. mysql&gt; show variables like &#39;%char%&#39;;
  35. +--------------------------+---------------------------------------------------------+
  36. | Variable_name | Value |
  37. +--------------------------+---------------------------------------------------------+
  38. | character_set_client | utf8 |
  39. | character_set_connection | utf8 |
  40. | character_set_database | utf8mb4 |
  41. | character_set_filesystem | binary |
  42. | character_set_results | utf8 |
  43. | character_set_server | utf8mb4 |
  44. | character_set_system | utf8 |
  45. | character_sets_dir | /usr/local/mysql-5.6.34-osx10.11-x86_64/share/charsets/ |
  46. +--------------------------+---------------------------------------------------------+
  47. mysql&gt; show variables like &#39;%coll%&#39;;
  48. +----------------------+--------------------+
  49. | Variable_name | Value |
  50. +----------------------+--------------------+
  51. | collation_connection | utf8_general_ci |
  52. | collation_database | utf8mb4_general_ci |
  53. | collation_server | utf8mb4_general_ci |
  54. +----------------------+--------------------+
  55. And I still don&#39;t get the correct characters in the records (&quot;&#231;&quot;, &quot;&#227;&quot;, &quot;&#225;&quot;, etc.):
  56. +----+----------------------+----------------------------+--------------------------------+----------------+
  57. | id | name | email | address | dataNascimento |
  58. +----+----------------------+----------------------------+--------------------------------+----------------+
  59. | 25 | Concei&#195;&#167;&#195;&#163;o | con@email | Rua Concei&#195;&#167;&#195;&#163;o, 1 | 2020-10-04 |
  60. +----+----------------------+----------------------------+--------------------------------+----------------
  61. What am I missing?...
  62. :(
  63. </details>
  64. # 答案1
  65. **得分**: 0
  66. 尝试将以下过滤器添加到您的项目中:
  67. ```java
  68. import javax.servlet.*;
  69. import javax.servlet.annotation.WebFilter;
  70. import java.io.IOException;
  71. @WebFilter("/*")
  72. public class CharacterEncodingFilter implements Filter {
  73. @Override
  74. public void init(FilterConfig config) throws ServletException {
  75. // NOOP.
  76. }
  77. @Override
  78. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  79. servletRequest.setCharacterEncoding("UTF-8");
  80. filterChain.doFilter(servletRequest, servletResponse);
  81. }
  82. @Override
  83. public void destroy() {
  84. // NOOP.
  85. }
  86. }

您可能还需要将以下内容添加到您的 web.xml 文件中:

  1. <filter>
  2. <filter-name>CharacterEncodingFilter</filter-name>
  3. <filter-class>your-class-name</filter-class>
  4. <init-param>
  5. <param-name>CharacterEncodingFilter</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. </filter>
  9. <filter-mapping>
  10. <filter-name>CharacterEncodingFilter</filter-name>
  11. <url-pattern>/*</url-pattern>
  12. </filter-mapping>
英文:

Try adding this filter to your project:

  1. import javax.servlet.*;
  2. import javax.servlet.annotation.WebFilter;
  3. import java.io.IOException;
  4. @WebFilter(&quot;/*&quot;)
  5. public class CharacterEncodingFilter implements Filter {
  6. @Override
  7. public void init(FilterConfig config) throws ServletException {
  8. // NOOP.
  9. }
  10. @Override
  11. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  12. servletRequest.setCharacterEncoding(&quot;UTF-8&quot;);
  13. filterChain.doFilter(servletRequest, servletResponse);
  14. }
  15. @Override
  16. public void destroy() {
  17. // NOOP.
  18. }
  19. }

You may also need to add this to your web.xml file

  1. &lt;filter&gt;
  2. &lt;filter-name&gt;CharacterEncodingFilter &lt;/filter-name&gt;
  3. &lt;filter-class&gt;your-class-name&lt;/filter-class&gt;
  4. &lt;init-param&gt;
  5. &lt;param-name&gt;CharacterEncodingFilter &lt;/param-name&gt;
  6. &lt;param-value&gt;UTF-8&lt;/param-value&gt;
  7. &lt;/init-param&gt;
  8. &lt;/filter&gt;
  9. &lt;filter-mapping&gt;
  10. &lt;filter-name&gt;CharacterEncodingFilter &lt;/filter-name&gt;
  11. &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
  12. &lt;/filter-mapping&gt;

huangapple
  • 本文由 发表于 2020年10月20日 00:37:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/64431648.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定