วิธีทำให้ UTF-8 ทำงานบน Java webapps ได้อย่างไร


367

ฉันต้องการให้ UTF-8 ทำงานใน Java webapp ของฉัน (servlets + JSP, ไม่ใช้เฟรมเวิร์ก) เพื่อสนับสนุนäöåฯลฯ สำหรับข้อความภาษาฟินแลนด์ปกติและตัวอักษร Cyrillic เช่นЦжФกรณีพิเศษ

การตั้งค่าของฉันมีดังต่อไปนี้:

  • สภาพแวดล้อมการพัฒนา: Windows XP
  • สภาพแวดล้อมการผลิต: Debian

ฐานข้อมูลที่ใช้: MySQL 5.x

ผู้ใช้ส่วนใหญ่ใช้ Firefox2 แต่ยังใช้ Opera 9.x, FF3, IE7 และ Google Chrome เพื่อเข้าถึงเว็บไซต์

ทำอย่างไรจึงจะได้สิ่งนี้?


คำตอบ:


552

ตอบคำถามตัวเองว่าเป็นคำถามที่พบบ่อยของเว็บไซต์นี้ สิ่งนี้ใช้ได้กับฉัน:

อักขระส่วนใหญ่äåöไม่ใช่ปัญหาเนื่องจากชุดอักขระเริ่มต้นที่ใช้โดยเบราว์เซอร์และ tomcat / java สำหรับ webapps คือ latin1 เช่น ISO-8859-1 ซึ่ง "เข้าใจ" อักขระเหล่านั้น

ในการทำให้ UTF-8 ทำงานภายใต้ Java + Tomcat + Linux / Windows + Mysql จำเป็นต้องมีสิ่งต่อไปนี้:

กำหนดค่า server.xml ของ Tomcat

จำเป็นต้องกำหนดค่าว่าตัวเชื่อมต่อใช้พารามิเตอร์ UTF-8 เพื่อเข้ารหัสพารามิเตอร์ url (คำขอ GET):

<Connector port="8080" maxHttpHeaderSize="8192"
 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
 enableLookups="false" redirectPort="8443" acceptCount="100"
 connectionTimeout="20000" disableUploadTimeout="true" 
 compression="on" 
 compressionMinSize="128" 
 noCompressionUserAgents="gozilla, traviata" 
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
 URIEncoding="UTF-8"
/>

ส่วนสำคัญคือURIEncoding = "UTF-8"ในตัวอย่างด้านบน การรับประกันนี้ที่ Tomcat จัดการกับพารามิเตอร์ GET ขาเข้าทั้งหมดตามการเข้ารหัส UTF-8 ดังนั้นเมื่อผู้ใช้เขียนสิ่งต่อไปนี้ในแถบที่อยู่ของเบราว์เซอร์:

 https://localhost:8443/ID/Users?action=search&name=*ж*

жตัวอักษรที่มีการจัดการเป็น UTF-8 และมีการเข้ารหัส (โดยปกติเบราว์เซอร์ก่อนที่จะได้เดินทางไปยังเซิร์ฟเวอร์) ตาม% D0% B6

คำขอ POST จะไม่ได้รับผลกระทบจากสิ่งนี้

CharsetFilter

จากนั้นถึงเวลาที่จะบังคับให้ java webapp จัดการคำขอและการตอบสนองทั้งหมดเมื่อเข้ารหัส UTF-8 สิ่งนี้ต้องการให้เรากำหนดตัวกรองชุดอักขระดังต่อไปนี้:

package fi.foo.filters;

import javax.servlet.*;
import java.io.IOException;

public class CharsetFilter implements Filter {

    private String encoding;

    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("requestEncoding");
        if (encoding == null) encoding = "UTF-8";
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
            throws IOException, ServletException {
        // Respect the client-specified character encoding
        // (see HTTP specification section 3.4.1)
        if (null == request.getCharacterEncoding()) {
            request.setCharacterEncoding(encoding);
        }

        // Set the default response content type and encoding
        response.setContentType("text/html; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        next.doFilter(request, response);
    }

    public void destroy() {
    }
}

ตัวกรองนี้ทำให้แน่ใจว่าหากเบราว์เซอร์ไม่ได้ตั้งค่าการเข้ารหัสที่ใช้ในคำขอแสดงว่ามันถูกตั้งค่าเป็น UTF-8

สิ่งอื่น ๆ ที่ทำโดยตัวกรองนี้คือการตั้งค่าการเข้ารหัสการตอบสนองเริ่มต้นเช่น การเข้ารหัสที่ส่งคืน html / อะไรก็ตาม ทางเลือกคือการตั้งค่าการเข้ารหัสการตอบสนอง ฯลฯ ในแต่ละคอนโทรลเลอร์ของแอปพลิเคชัน

ต้องเพิ่มตัวกรองนี้ในweb.xmlหรือตัวให้คำอธิบายการปรับใช้ของ webapp:

 <!--CharsetFilter start--> 

  <filter>
    <filter-name>CharsetFilter</filter-name>
    <filter-class>fi.foo.filters.CharsetFilter</filter-class>
      <init-param>
        <param-name>requestEncoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
  </filter>

  <filter-mapping>
    <filter-name>CharsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

คำแนะนำในการสร้างตัวกรองนี้อยู่ที่tomcat wiki ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )

การเข้ารหัสเพจ JSP

ในweb.xmlของคุณเพิ่มต่อไปนี้:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

หรือมิฉะนั้นหน้า JSP ทั้งหมดของ webapp จะต้องมีสิ่งต่อไปนี้ที่ด้านบนของพวกเขา:

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

หากมีการใช้เลย์เอาต์ที่มี JSP-fragments ต่างกันดังนั้นจึงจำเป็นต้องใช้สิ่งเหล่านี้ทั้งหมด

แท็ก HTML-meta

การเข้ารหัสเพจ JSP แจ้งให้ JVM จัดการอักขระในหน้า JSP ในการเข้ารหัสที่ถูกต้อง จากนั้นก็ถึงเวลาที่จะบอกเบราว์เซอร์ที่เข้ารหัสหน้า html:

สิ่งนี้ทำกับสิ่งต่อไปนี้ที่ด้านบนของแต่ละหน้า xhtml ที่ผลิตโดย webapp:

   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi">
   <head>
   <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
   ...

JDBC การเชื่อมต่อ

เมื่อใช้ db จะต้องมีการกำหนดว่าการเชื่อมต่อใช้การเข้ารหัส UTF-8 สิ่งนี้ทำในcontext.xmlหรือที่ใดก็ตามที่การเชื่อมต่อ JDBC เป็น defiend ดังนี้:

      <Resource name="jdbc/AppDB" 
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="20" maxIdle="10" maxWait="10000"
        username="foo"
        password="bar"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/      ID_development?useEncoding=true&amp;characterEncoding=UTF-8"
    />

ฐานข้อมูลและตาราง MySQL

ฐานข้อมูลที่ใช้จะต้องใช้การเข้ารหัส UTF-8 สิ่งนี้สามารถทำได้โดยการสร้างฐานข้อมูลดังต่อไปนี้:

   CREATE DATABASE `ID_development` 
   /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;

จากนั้นตารางทั้งหมดต้องอยู่ใน UTF-8 ด้วย:

   CREATE TABLE  `Users` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `name` varchar(30) collate utf8_swedish_ci default NULL
    PRIMARY KEY  (`id`)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC;

ส่วนที่สำคัญคือการcharset = utf8

การกำหนดค่าเซิร์ฟเวอร์ MySQL

MySQL serveri จะต้องมีการกำหนดค่าด้วย โดยทั่วไปแล้วจะทำใน Windows โดยการแก้ไขmy.ini -file และใน Linux โดยกำหนดค่าmy.cnf -file ในไฟล์เหล่านั้นควรกำหนดให้ไคลเอ็นต์ทั้งหมดที่เชื่อมต่อกับเซิร์ฟเวอร์ใช้ utf8 เป็นชุดอักขระเริ่มต้นและชุดอักขระเริ่มต้นที่ใช้โดยเซิร์ฟเวอร์นั้นยังเป็น utf8

   [client]
   port=3306
   default-character-set=utf8

   [mysql]
   default-character-set=utf8

ขั้นตอนและฟังก์ชั่น Mysql

สิ่งเหล่านี้จำเป็นต้องมีชุดอักขระที่กำหนดไว้ด้วย ตัวอย่างเช่น:

   DELIMITER $$

   DROP FUNCTION IF EXISTS `pathToNode` $$
   CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8
   READS SQL DATA
   BEGIN

    DECLARE path VARCHAR(255) CHARACTER SET utf8;

   SET path = NULL;

   ...

   RETURN path;

   END $$

   DELIMITER ;

รับคำขอ: latin1 และ UTF-8

ถ้าและเมื่อมันถูกกำหนดใน server.xml ของ tomcat ที่ GET ร้องขอพารามิเตอร์นั้นถูกเข้ารหัสใน UTF-8 คำขอ GET ต่อไปนี้จะได้รับการจัดการอย่างถูกต้อง:

   https://localhost:8443/ID/Users?action=search&name=Petteri
   https://localhost:8443/ID/Users?action=search&name=ж

เนื่องจากอักขระ ASCII ถูกเข้ารหัสด้วยวิธีเดียวกันทั้งกับ latin1 และ UTF-8 จึงมีการจัดการสตริง "Petteri" อย่างถูกต้อง

อักขระซีริลลิกไม่เข้าใจในละติน 1 ทั้งหมด เพราะ Tomcat ได้รับคำสั่งให้ค่าคำขอจับเป็น UTF-8 มันเข้ารหัสตัวอักษรที่ถูกต้องตาม% D0% B6

ถ้าและเมื่อเบราว์เซอร์จะได้รับคำแนะนำในการอ่านหน้าในการเข้ารหัส UTF-8 (ที่มีการร้องขอส่วนหัวและ HTML เมตาแท็ก) อย่างน้อย 2/3 Firefox และเบราว์เซอร์อื่น ๆ จากช่วงเวลานี้เข้ารหัสทุกตัวละครตัวเองเป็น% D0% B6

ผลลัพธ์สุดท้ายคือพบผู้ใช้ทั้งหมดที่มีชื่อ "Petteri" และพบผู้ใช้ทั้งหมดที่มีชื่อ "ж"

แต่แล้วäåöล่ะ

ข้อมูลจำเพาะของ HTTP กำหนดว่าโดย URL เริ่มต้นจะถูกเข้ารหัสเป็น latin1 ผลลัพธ์นี้ใน firefox2, firefox3 เป็นต้นการเข้ารหัสต่อไปนี้

    https://localhost:8443/ID/Users?action=search&name=*Päivi*

ในรุ่นที่เข้ารหัส

    https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*

ใน latin1 อักขระไธจะถูกเข้ารหัสเป็น% E4 แม้ว่าหน้า / คำขอ / ทุกอย่างถูกกำหนดให้ใช้ UTF-8 รุ่นที่เข้ารหัส UTF-8 ของäคือ% C3% A4

ผลที่ได้คือสิ่งนี้เป็นไปไม่ได้ที่เว็บแอปจะจัดการพารามิเตอร์คำขอจากคำขอ GET โดยทั่วไปเนื่องจากอักขระบางตัวถูกเข้ารหัสใน latin1 และอื่น ๆ ใน UTF-8 แจ้งให้ทราบล่วงหน้า: คำขอ POST ทำงานเป็นเบราว์เซอร์เข้ารหัสพารามิเตอร์คำขอทั้งหมดจากแบบฟอร์มอย่างสมบูรณ์ใน UTF-8 หากหน้าถูกกำหนดให้เป็น UTF-8

เรื่องน่าอ่าน

ขอบคุณมากสำหรับผู้เขียนต่อไปนี้ที่ให้คำตอบสำหรับปัญหาของฉัน:

  • http://tagunov.tripod.com/i18n/i18n.html
  • http://wiki.apache.org/tomcat/Tomcat/UTF-8
  • http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
  • http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
  • http://jeppesn.dk/utf-8.html
  • http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-td18720039.html
  • http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html
  • http://www.utf8-chartable.de/

โน๊ตสำคัญ

รองรับเครื่องบินแบบหลายภาษาขั้นพื้นฐานโดยใช้อักขระ UTF-8 ขนาด 3 ไบต์ หากคุณต้องการออกไปข้างนอกนั้น (ตัวอักษรบางตัวต้องมากกว่า 3-bytes ของ UTF-8) จากนั้นคุณต้องใช้รสชาติของVARBINARYประเภทคอลัมน์หรือใช้utf8mb4ชุดอักขระ (ซึ่งต้องใช้ MySQL 5.5.3 หรือใหม่กว่า) เพิ่งทราบว่าการใช้utf8ชุดอักขระใน MySQL จะไม่ทำงาน 100% ของเวลา

Tomcat กับ Apache

อีกอย่างหนึ่งถ้าคุณใช้ตัวเชื่อมต่อ Apache + Tomcat + mod_JK คุณก็ต้องทำการเปลี่ยนแปลงดังต่อไปนี้:

  1. เพิ่ม URIEncoding = "UTF-8" ลงในไฟล์ tomcat server.xml สำหรับตัวเชื่อมต่อ 8009 ซึ่งถูกใช้โดยตัวเชื่อมต่อ mod_JK <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
  2. ไปที่คุณ Apache โฟลเดอร์เช่น/etc/httpd/confและเพิ่มในAddDefaultCharset utf-8 หมายเหตุ:ตรวจสอบก่อนว่ามันมีอยู่หรือไม่ หากมีอยู่คุณสามารถอัปเดตด้วยสายนี้ คุณสามารถเพิ่มบรรทัดนี้ที่ด้านล่างได้httpd.conf file

ขั้นตอนเหล่านี้ยังทำงานกับ Struts / ไทล์และฐานข้อมูล postgres
kosoant

17
สองความคิดเห็น: 1) ในแท็ก HMTL-metaคุณรวมการประกาศ xml ลบมันมันจะเรียกเฉพาะเบราว์เซอร์ในโหมด quirks คุณไม่ต้องการที่ นอกจากนี้จริงๆแล้วเมตาแท็ก HTML นั้นทำโดยนัยแล้วโดย JSP pageEncodingดังนั้นคุณสามารถทิ้งมันไว้ได้ 2) ในฐานข้อมูล MySQL และตารางที่คุณใช้นี้ควรจะได้รับutf8_swedish_si utf8_unicode_ciคุณสามารถปล่อยให้การเรียงความออกไปได้ก็CHARACTER SET utf8เพียงพอแล้ว
BalusC

ไม่มีเอกสารใดที่ฉันได้พิจารณาเกี่ยวกับแท็ก meta HTML และโหมด quirks (เช่นericmeyeroncss.com/bonus/render-mode.html , en.wikipedia.org/wiki/Quirks_mode ) ระบุว่าเนื้อหาของ <meta http-equiv = ' -Type 'มีผลกระทบต่อโหมดการแสดงผลใด ๆ
Marcel Stör

ในฐานะที่เป็นบันทึกด้านข้างที่น่าสนใจคุณอาจต้องการทราบว่าหากคุณมีผู้ฟังที่เข้าถึงพารามิเตอร์คำขอคุณจะต้องเพิ่มผู้ฟังที่ตั้งชุดอักขระแทนชุดตัวกรองเนื่องจากตัวรับฟังจะถูกดำเนินการก่อนตัวกรอง ฉันทำตามทุกขั้นตอนและยังใช้งานไม่ได้เพราะสิ่งนี้ แค่คิดว่าฉันจะส่งต่อข้อมูลนี้ในกรณีที่คนอื่นมีปัญหาคล้ายกัน
ทดสอบ 123

3
## Tomcat กับ Apache ## อีกอย่างหนึ่งถ้าคุณใช้ Apache + Tomcat + mod_JK connector คุณต้องทำการเปลี่ยนแปลงต่อไปนี้: 1. เพิ่ม URIEncoding = "UTF-8" ลงในไฟล์ tomcat server.xml สำหรับตัวเชื่อมต่อ 8009 มัน ถูกใช้โดยตัวเชื่อมต่อ mod_JK <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/> 2. ไปที่โฟลเดอร์ apache ของคุณ/etc/httpd/confและเพิ่มAddDefaultCharset utf-8ในไฟล์ 'httpd.conf' หมายเหตุ:ตรวจสอบก่อนว่ามันมีอยู่หรือไม่ หากมีอยู่คุณสามารถอัปเดตด้วยสายนี้ คุณสามารถเพิ่มบรรทัดนี้ที่ด้านล่างได้
Vijay Shegokar

14

ฉันคิดว่าคุณสรุปได้ค่อนข้างดีในคำตอบของคุณเอง

ในกระบวนการ UTF-8-ing (?) ตั้งแต่ต้นจนจบคุณอาจต้องแน่ใจว่าจาวาเองนั้นใช้ UTF-8 ใช้ -Dfile.encoding = utf-8 เป็นพารามิเตอร์ให้กับ JVM (สามารถกำหนดค่าใน catalina.bat)


สิ่งนี้ช่วยฉันฉันทำทุกอย่างที่กล่าวถึง แต่การเข้ารหัส JVM เป็น windows-1250 ทันทีที่ฉันเปลี่ยนเป็น UTF-8 มันทำงานได้อย่างไม่มีที่ติ
coding_idiot

2
คุณเพิ่มที่ไหนในไฟล์ Catalina.bat ได้ไหม
โนอาห์

11

หากต้องการเพิ่มคำตอบของ kosoantหากคุณกำลังใช้ 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>

1
ตัวกรองนี้ต้องเป็นตัวกรองแรกใน web.xml
olyanren


1

นี่คือการเข้ารหัสภาษากรีกในตาราง MySql เมื่อเราต้องการเข้าถึงโดยใช้ Java:

ใช้การตั้งค่าการเชื่อมต่อต่อไปนี้ในพูลการเชื่อมต่อ 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

สำหรับฉันและ Nick ดังนั้นเราจึงไม่มีวันลืมและเสียเวลาอีกต่อไป .....


5
ฉันยังคงต้องการ UTF-8 เหนือกรีก (และแปลงข้อมูลกรีกปัจจุบันของคุณเป็น UTF-8) เพื่อให้ใบสมัครของคุณพร้อมสำหรับการครอบครองโลก
BalusC

1

คำตอบอย่างละเอียดดี ต้องการเพิ่มอีกสิ่งหนึ่งซึ่งจะช่วยให้ผู้อื่นเห็นการเข้ารหัส UTF-8 อย่างแน่นอนใน URL ที่ใช้งานจริง

ทำตามขั้นตอนด้านล่างเพื่อเปิดใช้งานการเข้ารหัส UTF-8 บน URL ใน firefox

  1. พิมพ์ "about: config" ในแถบที่อยู่

  2. ใช้ประเภทอินพุตตัวกรองเพื่อค้นหาคุณสมบัติ "network.standard-url.encode-query-utf8"

  3. คุณสมบัติข้างต้นจะเป็นเท็จโดยค่าเริ่มต้นเปลี่ยนเป็น TRUE
  4. รีสตาร์ทเบราว์เซอร์

การเข้ารหัส UTF-8 บน URL ใช้งานได้ตามค่าเริ่มต้นใน IE6 / 7/8 และโครม


1

คำตอบก่อนหน้าไม่สามารถทำงานกับปัญหาของฉัน มันเป็นเพียงการผลิตด้วย Tomcat และ apache mod_proxy_ajp โพสต์ร่างกายหายไปไม่ใช่ ASCII ตัวอักษรโดย? ปัญหาสุดท้ายคือกับ JVM defaultCharset (US-ASCII ในการติดตั้งเริ่มต้น: Charset dfset = Charset.defaultCharset ();) ดังนั้นการแก้ปัญหาคือรันเซิร์ฟเวอร์ Tomcat ด้วยตัวแก้ไขเพื่อเรียกใช้ JVM ด้วย UTF-8 เป็นตัวเริ่มต้น:

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 )

LC_ALL = en_US.UTF-8
ส่งออก LANG = en_US.UTF-8

ส่งออก LANGUAGE = en_US.UTF-8


0

ฉันมีปัญหาที่คล้ายกัน แต่ในชื่อไฟล์ของไฟล์ฉันกำลังบีบอัดด้วย apache คอมมอนส์ ดังนั้นฉันแก้ไขมันด้วยคำสั่งนี้:

convmv --notest -f cp1252 -t utf8 * -r

มันใช้งานได้ดีมากสำหรับฉัน หวังว่ามันจะช่วยให้ทุกคน;)


0

สำหรับกรณีของการแสดงอักขระ Unicode จากชุดข้อความฉันไม่จำเป็นต้องใช้ส่วน "การเข้ารหัสเพจ JSP" เพื่อแสดง Unicode ในหน้า jsp ของฉัน ทั้งหมดที่ฉันต้องการคือส่วน "CharsetFilter"


0

อีกจุดหนึ่งที่ไม่ได้กล่าวถึงเกี่ยวข้องกับ Java Servlets ที่ทำงานกับ Ajax ฉันมีสถานการณ์ที่หน้าเว็บรับข้อความ utf-8 จากผู้ใช้ที่ส่งสิ่งนี้ไปยังไฟล์ JavaScript ซึ่งรวมไว้ใน URI ที่ส่งไปยัง Servlet Servlet ทำการสืบค้นฐานข้อมูลจับผลลัพธ์และส่งคืนเป็น XML ไปยังไฟล์ JavaScript ซึ่งจัดรูปแบบและแทรกการตอบสนองที่จัดรูปแบบไว้ในหน้าเว็บดั้งเดิม

ในเว็บแอปเดียวฉันทำตามคำแนะนำของหนังสือ Ajax ตั้งแต่ต้นเพื่อห่อ JavaScript ในการสร้าง URI ตัวอย่างในหนังสือใช้เมธอด escape () ซึ่งฉันค้นพบ (วิธีที่ยาก) นั้นผิด สำหรับ utf-8 คุณต้องใช้ encodeURIComponent ()

ไม่กี่คนที่ดูเหมือนจะรีด Ajax ของตัวเองในวันนี้ แต่ฉันคิดว่าฉันอาจเพิ่มสิ่งนี้


0

เกี่ยวกับที่CharsetFilterกล่าวถึงใน @kosoant คำตอบ ....

มีการสร้างFilterในคราวweb.xml(อยู่ที่conf/web.xml) ตัวกรองการตั้งชื่อsetCharacterEncodingFilterและมีการแสดงความคิดเห็นโดยค่าเริ่มต้น คุณสามารถยกเลิกการใส่เครื่องหมายข้อคิดเห็นนี้ได้ (โปรดอย่าลืมใส่เครื่องหมายข้อคิดเห็นfilter-mappingด้วย)

นอกจากนี้คุณไม่จำเป็นต้องตั้งค่าjsp-configในของคุณweb.xml(ฉันมีการทดสอบสำหรับ Tomcat 7+)


0

บางครั้งคุณสามารถแก้ปัญหาผ่านตัวช่วยสร้างผู้ดูแลระบบ MySQL ใน

ตัวแปรเริ่มต้น> ขั้นสูง>

และตั้งค่า Def ชุดถ่าน: utf8

บางทีการกำหนดค่านี้ต้องรีสตาร์ท MySQL


0

ประสบปัญหาเดียวกันกับ Spring MVC 5 + Tomcat 9 + JSP
หลังจากการวิจัยที่ยาวนานมาถึงโซลูชันที่สวยงาม ( ไม่ต้องการตัวกรองและไม่จำเป็นต้องเปลี่ยนแปลงใน Tomcat server.xml (เริ่มต้นจากรุ่น 8.0.0-RC3))

  1. ในการใช้ WebMvcConfigurer การตั้งค่าการเข้ารหัสเริ่มต้นสำหรับ messageSource (สำหรับการอ่านข้อมูลจากไฟล์ต้นฉบับข้อความในการเข้ารหัส UTF-8

    @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 */
    
    }
  2. ในการใช้งาน DispatcherServletInitializer @Override วิธี onStartup และตั้งค่าการร้องขอและการเข้ารหัสอักขระทรัพยากรในนั้น

    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 */
    
    }
  3. บันทึกแหล่งข้อความทั้งหมดและดูไฟล์ในการเข้ารหัส UTF-8

  4. เพิ่ม <% @ page contentType = "text / html; charset = UTF-8"%> หรือ <% @ page pageEncoding = "UTF-8"%> ในแต่ละไฟล์ * .jsp หรือเพิ่มตัวอธิบาย jsp-config ไปยัง web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     id="WebApp_ID" version="3.0">
        <display-name>AppName</display-name>
    
        <jsp-config>
            <jsp-property-group>
                <url-pattern>*.jsp</url-pattern>
                <page-encoding>UTF-8</page-encoding>
            </jsp-property-group>
        </jsp-config>
    </web-app>

-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");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.