Bagaimana agar UTF-8 berfungsi di webapps Java?


367

Saya perlu membuat UTF-8 bekerja di webapp Java saya (servlets + JSP, tidak ada kerangka kerja yang digunakan) untuk mendukung äöådll untuk teks Finlandia biasa dan huruf Cyrillic seperti ЦжФuntuk kasus khusus.

Setup saya adalah sebagai berikut:

  • Lingkungan pengembangan: Windows XP
  • Lingkungan produksi: Debian

Basis data yang digunakan: MySQL 5.x

Pengguna terutama menggunakan Firefox2 tetapi juga Opera 9.x, FF3, IE7 dan Google Chrome digunakan untuk mengakses situs.

Bagaimana cara mencapai ini?


Jawaban:


552

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&amp;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

mendukung 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 VARBINARYtipe kolom atau menggunakan rangkaian utf8mb4karakter (yang membutuhkan MySQL 5.5.3 atau lebih baru). Perlu diketahui bahwa menggunakan utf8karakter 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:

  1. 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"/>
  2. Goto Anda apache folder yaitu /etc/httpd/confdan menambahkan AddDefaultCharset utf-8di 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.

Langkah-langkah ini juga berfungsi dengan Struts / ubin dan database postgres.
kosoant

17
Dua komentar: 1) dalam tag meta HMTL Anda menyertakan deklarasi xml. Hapus itu, itu hanya akan memicu browser dalam mode quirks, Anda tidak ingin memilikinya. Selain itu, tag meta HTML sebenarnya sudah dilakukan secara implisit oleh JSP pageEncoding, sehingga Anda bahkan bisa meninggalkannya. 2) di database MySQL dan tabel yang Anda gunakan utf8_swedish_si, ini seharusnya utf8_unicode_ci. Anda bahkan dapat meninggalkan pemeriksaan, CHARACTER SET utf8cukup saja.
BalusC

Tidak satu pun dari dokumen yang saya konsultasikan mengenai meta tag HTML dan mode quirks (mis. Ericmeyeroncss.com/bonus/render-mode.html , en.wikipedia.org/wiki/Quirks_mode ) menunjukkan bahwa keberadaan <meta http-equiv = 'Konten -Type 'berdampak pada mode rendering.
Marcel Stör

Sebagai catatan samping yang menarik, Anda mungkin juga ingin menyadari bahwa jika Anda memiliki pendengar yang mengakses parameter permintaan, Anda perlu menambahkan pendengar yang menetapkan rangkaian karakter sebagai ganti filter karena pendengar dieksekusi sebelum filter. Saya mengikuti semua langkah dan itu masih tidak berhasil karena ini. Saya pikir saya akan menyampaikan informasi ini, kalau-kalau ada orang lain yang memiliki masalah serupa.
testing123

3
## Tomcat dengan Apache ## Satu hal lagi Jika Anda menggunakan konektor Apache + Tomcat + mod_JK maka Anda juga perlu melakukan perubahan berikut: 1. Tambahkan URIEncoding = "UTF-8" ke file tomcat server.xml untuk konektor 8009, itu digunakan oleh konektor mod_JK. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/> 2. Buka folder apache Anda /etc/httpd/confdan tambahkan AddDefaultCharset utf-8file 'httpd.conf'. Catatan: periksa dulu apakah ada atau tidak. Jika ada, Anda dapat memperbaruinya dengan baris ini. Anda dapat menambahkan baris ini di bagian bawah juga.
Vijay Shegokar

14

Saya pikir Anda menyimpulkannya dengan cukup baik dalam jawaban Anda sendiri.

Dalam proses UTF-8-ing (?) Dari ujung ke ujung Anda mungkin juga ingin memastikan java sendiri menggunakan UTF-8. Gunakan -Dfile.encoding = utf-8 sebagai parameter untuk JVM (dapat dikonfigurasi dalam catalina.bat).


Ini membantu saya, saya melakukan semua yang disebutkan tetapi JVM encoding adalah windows-1250 segera setelah saya berubah menjadi UTF-8 bekerja dengan sempurna.
coding_idiot

2
Di mana Anda menambahkan itu dalam file Catalina.bat?
Noah

11

Untuk menambah jawaban kosoant , jika Anda menggunakan Spring, daripada menulis filter Servlet Anda sendiri, Anda bisa menggunakan kelas yang org.springframework.web.filter.CharacterEncodingFiltermereka sediakan, mengonfigurasinya seperti berikut di web.xml Anda:

 <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
Filter ini harus menjadi filter pertama di web.xml
olyanren

2

Saya juga ingin menambahkan dari sini bagian ini memecahkan masalah utf saya:

runtime.encoding=<encoding>

1

Ini untuk Pengkodean Yunani di tabel MySql ketika kami ingin mengaksesnya menggunakan Java:

Gunakan pengaturan koneksi berikut di kumpulan koneksi JBoss Anda (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>

Jika Anda tidak ingin meletakkan ini di kumpulan koneksi JNDI, Anda dapat mengkonfigurasinya sebagai url JDBC seperti yang digambarkan baris berikut:

jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek

Bagi saya dan Nick, jadi kami tidak pernah melupakannya dan membuang waktu lagi .....


5
Saya masih lebih suka UTF-8 di atas Yunani (dan mengkonversi data Yunani Anda saat ini ke UTF-8) sehingga aplikasi Anda siap untuk dominasi dunia.
BalusC

1

Jawaban terinci yang bagus. hanya ingin menambahkan satu hal lagi yang pasti akan membantu orang lain untuk melihat pengkodean UTF-8 pada URL yang sedang beraksi.

Ikuti langkah-langkah di bawah ini untuk mengaktifkan pengkodean UTF-8 pada URL di firefox.

  1. ketik "about: config" di bilah alamat.

  2. Gunakan tipe input filter untuk mencari properti "network.standard-url.encode-query-utf8".

  3. properti di atas akan salah secara default, ubah menjadi BENAR.
  4. mulai ulang browser.

Pengkodean UTF-8 pada URL berfungsi secara default di IE6 / 7/8 dan chrome.


1

Respons sebelumnya tidak berhasil dengan masalah saya. Itu hanya dalam produksi, dengan tomcat dan apache mod_proxy_ajp. Posting tubuh hilang ascii chars oleh? Masalahnya akhirnya adalah dengan JVM defaultCharset (US-ASCII dalam instalasi default: Charset dfset = Charset.defaultCharset ();) jadi, solusi dijalankan tomcat server dengan pengubah untuk menjalankan JVM dengan UTF-8 sebagai charset default:

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" 

(tambahkan baris ini ke catalina.sh dan layanan tomcat restart)

Mungkin Anda juga harus mengubah variabel sistem linux (edit ~ / .bashrc dan ~ /. Profil untuk perubahan permanen, lihat https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )

ekspor LC_ALL = en_US.UTF-8
ekspor LANG = en_US.UTF-8

ekspor LANGUAGE = en_US.UTF-8


0

Saya dengan masalah yang sama, tetapi, dalam nama file file saya mengompresi dengan apache commons. Jadi, saya menyelesaikannya dengan perintah ini:

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

ini bekerja sangat baik untuk saya. Semoga ini bisa membantu siapa saja;)


0

Untuk kasus saya menampilkan karakter Unicode dari bundel pesan, saya tidak perlu menerapkan bagian "JSP page encoding" untuk menampilkan Unicode pada halaman jsp saya. Yang saya butuhkan adalah bagian "CharsetFilter".


0

Satu hal lain yang belum disebutkan berkaitan dengan Java Servlets yang bekerja dengan Ajax. Saya memiliki situasi di mana halaman web mengambil teks utf-8 dari pengguna yang mengirim ini ke file JavaScript yang memasukkannya ke dalam URI yang dikirim ke Servlet. Servlet menanyakan database, menangkap hasilnya dan mengembalikannya sebagai XML ke file JavaScript yang memformatnya dan memasukkan respons yang diformat ke dalam halaman web asli.

Dalam satu aplikasi web saya mengikuti instruksi buku Ajax awal untuk menyelesaikan JavaScript dalam membangun URI. Contoh dalam buku ini menggunakan metode escape (), yang saya temukan (dengan cara yang sulit) salah. Untuk utf-8 Anda harus menggunakan komponen encodeURIC ().

Beberapa orang tampaknya menggulung Ajax mereka sendiri hari ini, tapi saya pikir saya mungkin juga menambahkan ini.


0

Tentang CharsetFilter disebutkan dalam jawaban @kosoant ....

Ada membangun Filterdi kucing jantan web.xml(terletak di conf/web.xml). Filter dinamai setCharacterEncodingFilterdan dikomentari secara default. Anda dapat menghapus komentar ini (Harap ingat untuk membatalkan komentarnyafilter-mapping )

Juga tidak perlu diatur jsp-configdalam Anda web.xml(saya telah mengujinya untuk Tomcat 7+)


0

Beberapa waktu Anda dapat menyelesaikan masalah melalui wisaya Administrator MySQL. Di

Variabel startup> Lanjutan>

dan atur Def. Set char: utf8

Mungkin konfigurasi ini perlu me-restart MySQL.


0

Menghadapi masalah yang sama pada Spring MVC 5 + Tomcat 9 + JSP.
Setelah penelitian panjang, datang ke solusi elegan ( tidak perlu filter dan tidak perlu perubahan di server Tomcat.xml (mulai dari versi 8.0.0-RC3))

  1. Dalam implementasi WebMvcConfigurer mengatur pengodean default untuk messageSource (untuk membaca data dari file sumber pesan dalam pengkodean 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. Dalam implementasi DispatcherServletInitializer @Override metode onStartup dan tetapkan permintaan dan pengkodean karakter sumber daya di dalamnya.

    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. Simpan semua sumber pesan dan lihat file dalam pengkodean UTF-8.

  4. Tambahkan <% @ page contentType = "text / html; charset = UTF-8"%> atau <% @ page pageEncoding = "UTF-8"%> di setiap file * .jsp atau tambahkan deskriptor jsp-config ke 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

Jika Anda telah menentukan dalam kumpulan koneksi (mysql-ds.xml), dalam kode Java Anda, Anda dapat membuka koneksi sebagai berikut:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek",
    "Myuser", "mypass");
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.