Menjawab diri saya sebagai FAQ situs ini mendorongnya. Ini bekerja untuk saya:
Sebagian besar karakter äåö tidak bermasalah karena set karakter default yang digunakan oleh browser dan tomcat / java untuk webapps adalah latin1 yaitu. ISO-8859-1 yang "memahami" karakter-karakter itu.
Untuk membuat UTF-8 bekerja di bawah Java + Tomcat + Linux / Windows + Mysql memerlukan yang berikut ini:
Mengkonfigurasi server Tomcat.xml
Penting untuk mengonfigurasi bahwa konektor menggunakan UTF-8 untuk menyandikan parameter url (GET request):
<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"
/>
Bagian kuncinya adalah URIEncoding = "UTF-8" pada contoh di atas. Ini menjamin bahwa Tomcat menangani semua parameter GET yang masuk saat UTF-8 dikodekan. Akibatnya, saat pengguna menulis yang berikut ke bilah alamat browser:
https://localhost:8443/ID/Users?action=search&name=*ж*
karakter ж ditangani sebagai UTF-8 dan dikodekan ke (biasanya oleh browser bahkan sebelum sampai ke server) sebagai % D0% B6 .
Permintaan POST tidak terpengaruh oleh ini.
Filter Charset
Maka inilah saatnya untuk memaksa webapp java untuk menangani semua permintaan dan tanggapan ketika UTF-8 dikodekan. Ini mengharuskan kami menetapkan filter rangkaian karakter seperti berikut:
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() {
}
}
Filter ini memastikan bahwa jika browser belum mengatur pengkodean yang digunakan dalam permintaan, itu diatur ke UTF-8.
Hal lain yang dilakukan oleh filter ini adalah mengatur pengkodean respons default, mis. pengkodean di mana html dikembalikan / apa pun. Alternatifnya adalah mengatur pengkodean respons, dll. Di setiap pengontrol aplikasi.
Filter ini harus ditambahkan ke web.xml atau deskriptor penggunaan 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>
Petunjuk untuk membuat filter ini dapat ditemukan di tomcat wiki ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )
Pengkodean halaman JSP
Di web.xml Anda , tambahkan berikut ini:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
Sebagai alternatif, semua halaman JSP dari webapp perlu memiliki yang berikut di atas mereka:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
Jika beberapa jenis tata letak dengan fragmen JSP yang berbeda digunakan, maka ini diperlukan pada semuanya .
Tag meta HTML
Pengkodean halaman JSP memberitahu JVM untuk menangani karakter di halaman JSP dalam pengkodean yang benar. Maka inilah saatnya untuk memberi tahu browser tempat penyandian laman html adalah:
Ini dilakukan dengan yang berikut di bagian atas setiap halaman xhtml yang dihasilkan oleh 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' />
...
Koneksi JDBC
Saat menggunakan db, harus didefinisikan bahwa koneksi menggunakan pengkodean UTF-8. Ini dilakukan dalam context.xml atau di mana pun koneksi JDBC didefinisikan sebagai berikut:
<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&characterEncoding=UTF-8"
/>
Database dan tabel MySQL
Basis data yang digunakan harus menggunakan pengkodean UTF-8. Ini dicapai dengan membuat database dengan yang berikut:
CREATE DATABASE `ID_development`
/*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;
Kemudian, semua tabel harus dalam UTF-8 juga:
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;
Bagian kuncinya adalah CHARSET = utf8 .
Konfigurasi server MySQL
Serveri MySQL juga harus dikonfigurasi. Biasanya ini dilakukan di Windows dengan memodifikasi my.ini -file dan di Linux dengan mengkonfigurasi my.cnf -file. Dalam file-file itu harus didefinisikan bahwa semua klien yang terhubung ke server menggunakan utf8 sebagai set karakter default dan bahwa charset default yang digunakan oleh server juga utf8.
[client]
port=3306
default-character-set=utf8
[mysql]
default-character-set=utf8
Prosedur dan fungsi Mysql
Ini juga perlu memiliki set karakter yang ditentukan. Sebagai contoh:
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 ;
DAPATKAN permintaan: latin1 dan UTF-8
Jika dan ketika didefinisikan dalam server tomcat.xml bahwa parameter permintaan GET dikodekan dalam UTF-8, permintaan GET berikut ditangani dengan benar:
https://localhost:8443/ID/Users?action=search&name=Petteri
https://localhost:8443/ID/Users?action=search&name=ж
Karena karakter ASCII dikodekan dengan cara yang sama baik dengan latin1 dan UTF-8, string "Petteri" ditangani dengan benar.
Karakter Cyrillic ж sama sekali tidak dipahami dalam bahasa latin1. Karena Tomcat diinstruksikan untuk menangani parameter permintaan sebagai UTF-8 ia mengkodekan karakter itu dengan benar sebagai % D0% B6 .
Jika dan ketika browser diperintahkan untuk membaca halaman-halaman dalam pengkodean UTF-8 (dengan header permintaan dan meta-tag html), setidaknya Firefox 2/3 dan browser lain dari periode ini semuanya mengkodekan karakternya sendiri sebagai % D0% B6 .
Hasil akhirnya adalah bahwa semua pengguna dengan nama "Petteri" ditemukan dan juga semua pengguna dengan nama "ж" ditemukan.
Tapi bagaimana dengan äåö?
Spesifikasi HTTP menentukan bahwa URL default disandikan sebagai latin1. Ini menghasilkan firefox2, firefox3 dll. Menyandikan yang berikut ini
https://localhost:8443/ID/Users?action=search&name=*Päivi*
masuk ke versi yang disandikan
https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*
Dalam latin1 karakter ä dikodekan sebagai % E4 . Meskipun halaman / permintaan / semuanya didefinisikan untuk menggunakan UTF-8 . Versi disandikan UTF-8 dari ä adalah % C3% A4
Hasil dari ini adalah bahwa sangat tidak mungkin bagi webapp untuk secara benar menangani parameter permintaan dari permintaan GET karena beberapa karakter dikodekan dalam latin1 dan lainnya di UTF-8.
Perhatian: Permintaan POST berfungsi karena browser menyandikan semua parameter permintaan dari formulir sepenuhnya di UTF-8 jika halaman didefinisikan sebagai UTF-8
Barang untuk dibaca
Terima kasih banyak untuk penulis-penulis di bawah ini karena telah memberikan jawaban untuk masalah saya:
- 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/id/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/
Catatan penting
mysqlmendukung Basic Multilingual Plane menggunakan 3-byte karakter UTF-8. Jika Anda perlu keluar dari itu (huruf tertentu membutuhkan lebih dari 3-byte dari UTF-8), maka Anda harus menggunakan rasa VARBINARY
tipe kolom atau menggunakan rangkaian utf8mb4
karakter (yang membutuhkan MySQL 5.5.3 atau lebih baru). Perlu diketahui bahwa menggunakan utf8
karakter yang diatur dalam MySQL tidak akan berfungsi 100% dari waktu.
Tomcat dengan Apache
Satu hal lagi Jika Anda menggunakan konektor Apache + Tomcat + mod_JK maka Anda juga perlu melakukan perubahan berikut:
- Tambahkan URIEncoding = "UTF-8" ke file tomcat server.xml untuk konektor 8009, ini digunakan oleh konektor mod_JK.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
- Goto Anda apache folder yaitu
/etc/httpd/conf
dan menambahkan AddDefaultCharset utf-8
di httpd.conf file
. Catatan: Pertama periksa apakah ada atau tidak. Jika ada, Anda dapat memperbaruinya dengan baris ini. Anda dapat menambahkan baris ini di bagian bawah juga.