Menjawab sendiri sebagai FAQ dari situs ini mendorongnya. Ini bekerja untuk saya:
Sebagian besar karakter ö tidak bermasalah karena set karakter default yang digunakan oleh browser dan Tomcat/Java untuk aplikasi web adalah latin1 yaitu. ISO-8859-1 yang "memahami" karakter tersebut.
Agar UTF-8 berfungsi di bawah Java+Tomcat+Linux/Windows+Mysql memerlukan yang berikut:
Mengonfigurasi server.xml Tomcat
Penting untuk mengonfigurasi bahwa konektor menggunakan UTF-8 untuk mengkodekan parameter url (DAPATKAN permintaan):
<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" dalam contoh di atas. Ini menjamin bahwa Tomcat menangani semua parameter GET yang masuk sebagai dikodekan UTF-8. Akibatnya, ketika 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 saatnya untuk memaksa aplikasi web java untuk menangani semua permintaan dan tanggapan sebagai UTF-8 dikodekan. Ini mengharuskan kita mendefinisikan filter kumpulan 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 menyetel pengkodean yang digunakan dalam permintaan, itu disetel ke UTF-8.
Hal lain yang dilakukan oleh filter ini adalah mengatur penyandian respons default yaitu. pengkodean di mana html yang dikembalikan/apa pun itu. Alternatifnya adalah mengatur penyandian respons, dll. di setiap pengontrol aplikasi.
Filter ini harus ditambahkan ke web.xml atau deskriptor penerapan aplikasi web:
<!--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 wiki Tomcat ( 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>
Atau, semua halaman JSP dari aplikasi web harus memiliki yang berikut ini di atasnya:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
Jika beberapa jenis tata letak dengan fragmen JSP yang berbeda digunakan, maka ini diperlukan di semua dari mereka.
Tag meta-HTML
Pengkodean halaman JSP memberi tahu JVM untuk menangani karakter di halaman JSP dalam penyandian yang benar. Kemudian saatnya memberi tahu browser tempat pengkodean halaman html:
Ini dilakukan dengan yang berikut ini di bagian atas setiap halaman xhtml yang dihasilkan oleh aplikasi web:
<?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 ditentukan bahwa koneksi menggunakan pengkodean UTF-8. Ini dilakukan di context.xml atau dimanapun koneksi JDBC ditetapkan 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
Database yang digunakan harus menggunakan encoding 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
Server 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 set karakter 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. Misalnya:
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 ditentukan di server.xml Tomcat bahwa parameter permintaan GET dikodekan dalam UTF-8, permintaan GET berikut akan 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 Sirilik tidak dipahami sama sekali dalam bahasa latin1. Karena Tomcat diinstruksikan untuk menangani parameter permintaan sebagai UTF-8, ia mengkodekan karakter tersebut dengan benar sebagai %D0%B6 .
Jika dan ketika browser diinstruksikan untuk membaca halaman dalam pengkodean UTF-8 (dengan header permintaan dan tag meta html), setidaknya Firefox 2/3 dan browser lain dari periode ini semuanya menyandikan karakter itu sendiri sebagai %D0% B6 .
Hasil akhirnya semua pengguna dengan nama "Petteri" ditemukan dan juga semua pengguna dengan nama "ж" ditemukan.
Tapi bagaimana dengan ö?
Spesifikasi HTTP mendefinisikan bahwa secara default URL dikodekan sebagai latin1. Ini menghasilkan firefox2, firefox3 dll. mengkodekan kode berikut
https://localhost:8443/ID/Users?action=search&name=*Päivi*
ke versi yang disandikan
https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*
Dalam latin1 karakter ä dikodekan sebagai %E4 . Meskipun halaman/permintaan/semuanya ditentukan untuk menggunakan UTF-8 . Versi yang disandikan UTF-8 adalah %C3%A4
Hasilnya adalah sangat tidak mungkin bagi aplikasi web untuk menangani parameter permintaan dengan benar dari permintaan GET karena beberapa karakter dikodekan dalam latin1 dan lainnya dalam UTF-8.Perhatikan:Permintaan POST berfungsi karena browser menyandikan semua parameter permintaan dari formulir sepenuhnya dalam UTF-8 jika halaman didefinisikan sebagai UTF-8
Hal-hal untuk dibaca
Terima kasih yang sebesar-besarnya untuk para penulis berikut yang telah memberikan jawaban atas 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/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/
Catatan Penting
mysql
mendukung Pesawat Multibahasa Dasar
menggunakan karakter UTF-8 3-byte. Jika Anda perlu keluar dari itu (abjad tertentu membutuhkan lebih dari 3-byte UTF-8), maka Anda juga perlu menggunakan rasa VARBINARY
ketik kolom atau gunakan utf8mb4
kumpulan karakter
(yang membutuhkan MySQL 5.5.3 atau lebih baru). Perlu diketahui bahwa menggunakan utf8
set karakter di MySQL tidak akan berfungsi 100% setiap saat.
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 dalam file Tomcat server.xml untuk konektor 8009, digunakan oleh konektor mod_JK.