Jadual Kandungan
JAVA WEB 乱码问题解析
乱码原因
编码与解码
乱码分析与解决
Rumah Java javaTutorial JAVA WEB 笔记--中文乱码

JAVA WEB 笔记--中文乱码

Jun 26, 2017 am 11:11 AM
web cina Watak bercelaru nota

JAVA WEB 乱码问题解析

乱码原因

  在Java Web开发过程中,经常遇到乱码的问题,造成乱码的原因,概括起来就是对字符编码和解码的方式不匹配。

  既然乱码的原因是字符编码与解码的方式不匹配,那么为什么我们一定要对字符进行编码,不编码可不可以呢?这是因为在计算机中存储数据的基本单位是1个字节,即8个bit,那么它所能表达的字符的最多有28=256个,而在我们现实社会中存在的字符(汉字、英文、其他文字等等)远远多余这个数字,所以为了解决字符与字节的矛盾,对字符进行编码处理才能存储在计算机中。

编码与解码

  在计算机中常见的编码方式有ASCII、ISO-8859-1、GB2312、UTF-16、UTF-8几种编码方式。

  ASCII码是使用一个字节的低7位来表示的,所以共能表达的字符最多有27=128个。ISO-8859-1是ISO组织基于ASCII码的基础上扩展来的,兼容ASCII码,涵盖了大多数西欧字符。ISO8859-1使用一个字节来表示,所以其能表达的字符最多有256个。GB2312,采用了双字节编码,编码范围是A1-F7,其中A1-A9是符号区,B0-F7是汉字区,包含6763个汉字。GBK是为了扩展GB2312编码,并加入了更多的汉字,总能表达的汉字有21003个。UTF-16是采用定长的编码方式,无论什么字符都采用2个字节进行表示,这也是JAVA内存中字符的存储格式。与UTF-16相反,UTF-8采用了变长的编码方式,不同的类型的字符可以由1-6个字节组成。

   下面以字符串“日向雏田”来看一下在计算机中不同编码方式的编码,如下图。

 

乱码分析与解决

  对于JAVA WEB中乱码问题,我们划分位请求导致的乱码和响应导致的乱码,对于不同的乱码我们要分析其乱码原因,即字符编码的方式是什么,解码的方式是什么。

  对于由于请求导致的乱码我们要分析Http请求,查看其编码方式,由于HTTP请求分为Get请求和Post请求,我们接下来分别对其进行讨论。

  对于Get请求,是浏览器默认的请求方式,和表单提交时设置为“Get”时的提交方式。我们通过火狐浏览器我们查看其具体内容如下:

  地址栏为:

  请求内容为:

  

  通过上面请求我们可以看到,GET请求中查询字符串放在了请求行中存放,发送到WEB服务器中,通过“日向雏田”编码我们可以看到,浏览器对该字符串采用的编码方式为“UTF-8”。

  查看服务器代码我们可以看到乱码(如下图),这是因为服务器在接受到该字符串编码后的数据默认通过ISO-8859-1的方式进行解码,所以造成了编码与解码的方式不统一。

  

  解决方案如下:

  首先获取字符串user解码前的编码,然后指定该字符串的编码方式,如下图:

  解决方案示意图如下:

 

  在Java web开发过程中,我们在超链接中传递参数,经常遇到中文的情况。对此情况下,我们需要对中文进行编码,我们可以设置为UTF-8,解码方案同上。

  

<a href="${pageContext.request.contextPath}/Test?user=<%=URLEncoder.encode("日向雏田", "UTF-8")%>">点击</a>
Salin selepas log masuk

  对于Post请求,是表单提交时设置为“Post”时的提交方式。我们通过火狐浏览器我们查看其具体内容如下:

  地址栏及其页面为:

  

  post请求内容为:

  

  由上图我们可以知道,在post请求中,将请求内容直接放在请求体中发送给web服务器,编码方式为“utf-8”。

  在此响应Servlet中,doPost方法体如下:

  

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String user=request.getParameter("user");
		System.out.println(user);//输出为日向雏田
	}
Salin selepas log masuk

  此处乱码的原因依然时在代码getParameter(“user”)时,web服务器采用默认的解码方案“ISO-8859-1”进行解码,导致了编码与解码方案的不同意,解决方案可以采用get请求乱码的解决方案,但是还有一种更为简单的解决方案,直接指定方法体的编码/解码方案为“utf-8”。方案如下。

  

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");  //设置请求体的编码/解码方案为UTF-8 但是请求行的编码解码方案不会受影响
		String user=request.getParameter("user");
		System.out.println(user);          //输出为日向雏田
	}
Salin selepas log masuk

  以上对于请求导致的乱码情况分析完毕。

  在影响导致的乱码中,web服务器会将响应的内容写入响应体中,返回给客户端并不会涉及到状态行中的情况。如向浏览器输出”HelloWorld“其响应如下图所说。

  对于响应导致的乱码我们不得不涉及到四个方法,如下:

 

response.setHeader("Content-Type", "text/html;cahrset=utf-8");//设置发送到客户端的响应的内容类型和响应内容的编码类型(响应体的编码类型)
response.setCharacterEncoding("utf-8");//设置响应体的编码类型
response.getWriter();           //获取响应的输出字符流 
response.getOutputStream();        //获取响应的输出字节流
Salin selepas log masuk

  对于设置响应体的编码类型,如response.setHeader("Content-Type", "text/html;cahrset=utf-8");与response.setCharacterEncoding("utf-8");这2个方法设置的编码方式等效,若没有设置响应体的编码方式,则默认为ISO-8859-1,而且后面设置响应体字符的编码方式会迭代前面的设置编码的方式。这两个方法均在getWriter方法前有效,在getWriter方法设置编码的方法会无效。

  但是这2个方法却有点不同,即setHeader("Content-Type", "text/html;cahrset=utf-8")这个方法浏览器会自动采用该响应体的编码方式进行解码,而setCharacterEncoding()该方法并不是所有的浏览器都会采用该方法的编码方式进行解码,下面对这2个方法进行测试,效果如下:

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setHeader("Content-Type", "text/html;charset=utf-8");
		response.getWriter().write("日向雏田");
	}
Salin selepas log masuk

  

  

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.getWriter().write("日向雏田");
	}
Salin selepas log masuk

  

  从上面可以看到第一个方法对于浏览器来说,支持的较好,提倡采用第一种方法设置响应体的字符编码方式。

  对于获取响应字符输出流的方法,如果在此之前没有设置响应体的编码方式,那么默认为null,即ISO-8859-1方式进行编码。而且后面设置的编码方式会覆盖前面设置的编码方式。在getWriter()方法之后设置的编码无效。

  对于获取响应输出字节流,我们在输出字符串时,我们需要设置字符串的编码方式如果没有那么默认ISO-8859-1。

  对于前面2个输出流,由于只有一个输出缓存,所以这两个方法互斥。

  以上,为了保证响应无乱码,需要保证字符编码和解码方法的统一,方案如下:

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//	方案1
//		response.setHeader("Content-Type", "text/html;charset=utf-8");
//		response.getWriter().write("日向雏田");
//	方案2
//		response.getOutputStream().write("日向雏田".getBytes("UTF-8"));
//	方案1,2互斥
	}
Salin selepas log masuk

  

  此外在Java web开发过程中,我们还会遇到当进行文件下载时,中文文件名导致的问题,如下图所示:

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String realPath=this.getServletContext().getRealPath("/src/日向雏田.jpg");
		String fileName=realPath.substring(realPath.lastIndexOf(&#39;\\&#39;)+1);
		response.setHeader("content-disposition", "attachment;filename="+fileName);
		InputStream is=new FileInputStream(new File(realPath));
		OutputStream os=response.getOutputStream();
		byte[] buff=new byte[1024];
		int len=0;
		while((len=is.read(buff))>0){
			os.write(buff, 0, len);
		}
		os.close();
		is.close();
	}
Salin selepas log masuk

  采用火狐浏览器进行测试,查看页面效果,及其响应结果如下:

  

  经过查看响应头分析,下载文件名存放在响应头中,且对于中文文字没有采用UTF-8、UTF-16、GBK等等能识别中文的编码,那么对于中文文件名导致采用哪种编码方式呢?查看REF 7578得知,在此处采用ASCII编码,但是REF规定,如果不可避免的要使用非ASCII码的字符,程序员应该均匀的使用UTF-8,来最小化交互操作的问题。

  所以,解决方案就是把文件名编码成UTF-8,传递给响应头,浏览器(部分)默认对该文件名进行UTF-8解码处理。

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String realPath=this.getServletContext().getRealPath("/src/日向雏田.jpg");
		String fileName=realPath.substring(realPath.lastIndexOf(&#39;\\&#39;)+1);
		String utf_8Name=URLEncoder.encode(fileName,"utf-8");//解决方案
		response.setHeader("content-disposition", "attachment;filename="+utf_8Name);
		InputStream is=new FileInputStream(new File(realPath));
		OutputStream os=response.getOutputStream();
		byte[] buff=new byte[1024];
		int len=0;
		while((len=is.read(buff))>0){
			os.write(buff, 0, len);
		}
		os.close();
		is.close();
	}
Salin selepas log masuk

  效果如下:其中火狐浏览器并没有对其解码

 

Atas ialah kandungan terperinci JAVA WEB 笔记--中文乱码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk memadam nota Xiaohongshu Bagaimana untuk memadam nota Xiaohongshu Mar 21, 2024 pm 08:12 PM

Bagaimana untuk memadamkan nota Xiaohongshu? pandangan! Tutorial penggunaan Xiaohongshu Cara memadam nota Xiaohongshu 1. Mula-mula buka APP Xiaohongshu dan masukkan halaman utama, pilih [Saya] di sudut kanan bawah untuk memasuki kawasan khas 2. Kemudian di kawasan Saya, klik pada halaman nota sebagai ditunjukkan di bawah , pilih nota yang anda mahu padamkan;

Cara menetapkan bahasa Cina dalam permainan mudah alih Call of Duty: Warzone Cara menetapkan bahasa Cina dalam permainan mudah alih Call of Duty: Warzone Mar 22, 2024 am 08:41 AM

Call of Duty Warzone ialah permainan mudah alih yang baru dilancarkan Ramai pemain sangat ingin tahu tentang cara menetapkan bahasa permainan ini kepada bahasa Cina Malah, ia adalah sangat mudah ubah suai selepas menggunakannya. Kandungan terperinci boleh dipelajari dalam pengenalan kaedah tetapan bahasa Cina ini. Mari kita lihat bersama. Cara menetapkan bahasa Cina untuk permainan mudah alih Call of Duty: Warzone 1. Mula-mula masukkan permainan dan klik ikon tetapan di penjuru kanan sebelah atas antara muka. 2. Dalam bar menu yang muncul, cari pilihan [Muat Turun] dan klik padanya. 3. Pilih [SIMPLIFIEDCHINESE] (Simplified Chinese) pada halaman ini untuk memuat turun pakej pemasangan Chinese Simplified. 4. Kembali ke tetapan

Menyediakan bahasa Cina dengan VSCode: Panduan Lengkap Menyediakan bahasa Cina dengan VSCode: Panduan Lengkap Mar 25, 2024 am 11:18 AM

Persediaan VSCode dalam Bahasa Cina: Panduan Lengkap Dalam pembangunan perisian, Visual Studio Code (VSCode ringkasnya) ialah persekitaran pembangunan bersepadu yang biasa digunakan. Bagi pembangun yang menggunakan bahasa Cina, menetapkan VSCode kepada antara muka Cina boleh meningkatkan kecekapan kerja. Artikel ini akan memberi anda panduan lengkap, memperincikan cara menetapkan VSCode kepada antara muka Cina dan menyediakan contoh kod khusus. Langkah 1: Muat turun dan pasang pek bahasa Selepas membuka VSCode, klik di sebelah kiri

Bagaimana untuk menetapkan jadual Excel untuk memaparkan bahasa Cina? Tutorial pengendalian bahasa Cina penukaran Excel Bagaimana untuk menetapkan jadual Excel untuk memaparkan bahasa Cina? Tutorial pengendalian bahasa Cina penukaran Excel Mar 14, 2024 pm 03:28 PM

Hamparan Excel adalah salah satu perisian pejabat yang ramai orang gunakan sekarang, kerana komputer mereka adalah sistem Win11, jadi antara muka bahasa Inggeris dipaparkan itu. Untuk menyelesaikan masalah ini, isu ini Editor berada di sini untuk menjawab soalan untuk semua pengguna Mari lihat kandungan yang dikongsi dalam tutorial perisian hari ini. Tutorial untuk menukar Excel kepada bahasa Cina: 1. Masukkan perisian dan klik pilihan "Fail" di sebelah kiri bar alat di bahagian atas halaman. 2. Pilih "pilihan" daripada pilihan yang diberikan di bawah. 3. Selepas memasuki antara muka baharu, klik pilihan "bahasa" di sebelah kiri

Apakah yang perlu saya lakukan jika nota yang saya siarkan di Xiaohongshu tiada? Apakah sebab mengapa nota yang dihantar tidak ditemui? Apakah yang perlu saya lakukan jika nota yang saya siarkan di Xiaohongshu tiada? Apakah sebab mengapa nota yang dihantar tidak ditemui? Mar 21, 2024 pm 09:30 PM

Sebagai pengguna Xiaohongshu, kita semua pernah menghadapi situasi di mana nota yang diterbitkan tiba-tiba hilang, yang sudah pasti mengelirukan dan membimbangkan. Dalam kes ini, apa yang perlu kita lakukan? Artikel ini akan menumpukan pada topik "Apa yang perlu dilakukan jika nota yang diterbitkan oleh Xiaohongshu hilang" dan memberi anda jawapan terperinci. 1. Apakah yang perlu saya lakukan jika nota yang diterbitkan oleh Xiaohongshu tiada? Pertama, jangan panik. Jika anda mendapati nota anda tiada, bertenang adalah kunci dan jangan panik. Ini mungkin disebabkan oleh kegagalan sistem platform atau ralat operasi. Menyemak rekod keluaran adalah mudah. Cuma buka Apl Xiaohongshu dan klik "Saya" → "Terbitkan" → "Semua Penerbitan" untuk melihat rekod penerbitan anda sendiri. Di sini anda boleh mencari nota yang disiarkan sebelum ini dengan mudah. 3.Siaran semula. Jika dijumpai

Cara menambah pautan produk dalam nota dalam Xiaohongshu Tutorial menambah pautan produk dalam nota dalam Xiaohongshu Cara menambah pautan produk dalam nota dalam Xiaohongshu Tutorial menambah pautan produk dalam nota dalam Xiaohongshu Mar 12, 2024 am 10:40 AM

Bagaimana untuk menambah pautan produk dalam nota dalam Xiaohongshu? Dalam aplikasi Xiaohongshu, pengguna bukan sahaja boleh menyemak imbas pelbagai kandungan tetapi juga membeli-belah, jadi terdapat banyak kandungan tentang cadangan membeli-belah dan perkongsian produk yang baik dalam aplikasi ini pada aplikasi ini, anda juga boleh berkongsi beberapa pengalaman membeli-belah, mencari peniaga untuk kerjasama, menambah pautan dalam nota, dll. Ramai orang sanggup menggunakan aplikasi ini untuk membeli-belah, kerana ia bukan sahaja mudah, tetapi juga mempunyai ramai Pakar akan membuat beberapa cadangan Anda boleh menyemak imbas kandungan yang menarik dan melihat sama ada terdapat produk pakaian yang sesuai dengan anda. Mari lihat cara menambah pautan produk pada nota Cara menambah pautan produk ke Xiaohongshu Notes Buka aplikasi pada desktop telefon mudah alih anda. Klik pada halaman utama apl

Adakah wwe2k24 akan mempunyai bahasa Cina? Adakah wwe2k24 akan mempunyai bahasa Cina? Mar 13, 2024 pm 04:40 PM

"WWE2K24" ialah permainan sukan lumba yang dicipta oleh Visual Concepts dan dikeluarkan secara rasmi pada 9 Mac 2024. Permainan ini sangat dipuji, dan ramai pemain sangat berminat sama ada ia akan mempunyai versi Cina. Malangnya, setakat ini, "WWE2K24" masih belum melancarkan versi bahasa Cina. Adakah wwe2k24 dalam bahasa Cina Jawapan: Bahasa Cina tidak disokong pada masa ini. Versi standard WWE2K24 di rantau Steam China berharga 199 yuan, versi deluxe ialah 329 yuan, dan edisi peringatan ialah 395 yuan. Permainan ini mempunyai keperluan konfigurasi yang agak tinggi, dan terdapat piawaian tertentu dari segi pemproses, kad grafik atau memori berjalan. Konfigurasi yang disyorkan rasmi dan pengenalan konfigurasi minimum:

Petua untuk menyelesaikan aksara Cina yang kacau apabila menulis fail txt dengan PHP Petua untuk menyelesaikan aksara Cina yang kacau apabila menulis fail txt dengan PHP Mar 27, 2024 pm 01:18 PM

Petua untuk menyelesaikan aksara Cina bercelaru yang ditulis oleh PHP ke dalam fail txt Dengan perkembangan pesat Internet, PHP, sebagai bahasa pengaturcaraan yang digunakan secara meluas, digunakan oleh semakin ramai pembangun. Dalam pembangunan PHP, selalunya perlu membaca dan menulis fail teks, termasuk fail txt yang menulis kandungan bahasa Cina. Walau bagaimanapun, disebabkan masalah format pengekodan, kadangkala tulisan Cina akan kelihatan bercelaru. Artikel ini akan memperkenalkan beberapa teknik untuk menyelesaikan masalah aksara Cina bercelaru yang ditulis ke dalam fail txt oleh PHP, dan menyediakan contoh kod khusus. Analisis masalah dalam PHP, teks

See all articles