返回顶部
首页 > 资讯 > 精选 >web前端中文乱码是怎么产生的
  • 269
分享到

web前端中文乱码是怎么产生的

2023-07-04 14:07:11 269人浏览 安东尼
摘要

今天小编给大家分享一下web前端中文乱码是怎么产生的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。中文乱码的产生原因:解码方

今天小编给大家分享一下web前端中文乱码是怎么产生的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

中文乱码的产生原因:解码方式和编码方式不一致。一个中文字符以utf-8编码会转成3个byte,如果以gbk编码会转成2个byte;而一个英文字符以utf-8编码会转成1个byte,如果以gbk编码会转成1个byte。

先说一下什么叫乱码

不知道有没有人这样认为过,一个字符串不仅仅包含字符,还有隐藏着它的编码信息。比如java中String str = "你好";我之前是这样认为的,str这个字符串隐藏着它的编码方式unicode编码或者gbk、iso-8859-1等。这种理解是错误的,字符就是字符没有任何其他信息,正确的理解应该是,人在一个文件中所看到的字符串是系统经过把内存中的数码信息读取也再解码成一些字符最后显示,就是当你双击打开一个文本文件时系统会把内存的数码信息读取显示出来,当你保存一个文本文件时系统会把这个文件以你所设置的编码方式编码,再放进内存中。

所以说乱码也是一些字符,只是奇怪的字符而已,并没有什么”码“。

接着说乱码产生的原因

我们经常看到网上这样解释乱码原因:乱码是因为解码方式和编码方式不一致导致的,这句话本身没有错,但同样这句话的本身就是把乱码概括了而已,它并不能帮助你理解乱码。

所以我们要提的问题是:为什么解码方式和编码方式不一致会出现乱码。

这里以utf-8,gbk,iso-8859-1三种编码方式为例。

     @Test
     public void testEncode() throws Exception {
        String str = "你好",en = "h?h";
        
        System.out.println("========中文字符utf-8=======");
        byte[] utf8 = str.getBytes(); // 以utf-8方式编码 ,default:utf-8
        for (byte b : utf8) {            
            System.out.print(b + "\t");
        }
        
        System.out.println("\n"+"========英文字符utf-8=======");
        byte[] utf8_en = en.getBytes(); // 以utf-8方式编码 ,default:utf-8
        for (byte b : utf8_en) {            
            System.out.print(b + "\t");
        }
        
        System.out.println("\n"+"========中文字符gbk=========");
        byte[] gbk = str.getBytes("gbk");
        for (byte b : gbk) {            
            System.out.print(b + "\t");
        }
        
        System.out.println("\n"+"========英文字符gbk=========");
        byte[] gbk_en = en.getBytes("gbk");
        for (byte b : gbk_en) {            
            System.out.print(b + "\t");
        }
        
        String s = new String(utf8,"utf-8");
        String s1 = new String(utf8,"gbk");
        System.out.println("\n"+s + "====gbk:" + s1);
     }

测试上面方法,打印的结果是:

========中文字符utf-8=======
-28 -67  -96 -27  -91 -67  
========英文字符utf-8=======
104 63  104 
========中文字符gbk=========
-60 -29  -70 -61  
========英文字符gbk=========
104 63  104 
你好====gbk:浣犲ソ
------------------------------------------------------------------------------------

可以得出结论:

一个中文字符以utf-8编码会转成3个byte,如果以gbk编码会转成2个byte;

一个英文字符以utf-8编码会转成1个byte,如果以gbk编码会转成1个byte。

从打印的最后一行结合29-31行代码可以看出,如果把byte数组utf8 以utf-8的方式解码不会有乱码,还是原来的”你好“,而如果以gbk方式解码则出现了三个乱码字符,为什么是3个而不是2个呢,6/2=3。

接下来说iso-8859-1,这种编码应用于英文系列,也就是说不能表示中文(如果要使用必须依赖于其它兼容iso-8859-1编码方式的编码),它读不懂的字符都将被视为英文问号'?',英文问号的iso-8859-1编码号是:63(十进制)(其实在几乎所有的编码方式中,所有英文字符都用1个固定的字节码表示,unicode编码除外)。

     @Test
     public void testISO() throws Exception {
         String str = "你好";
         byte[] bs = str.getBytes("iso-8859-1");
         for (byte b : bs) {
            System.out.println(b);
         }
         System.out.println(new String(bs,"iso-8859-1"));
         System.out.println(new String(bs,"utf-8"));
         System.out.println(new String(bs,"gbk"));
         System.out.println(new String(bs,"unicode"));         
     }

打印结果

63
63
??
??
??
㼿

说明63 =》?,所有中文都被认为是?,所以说当执行这句代码时:byte[] bs = "你好".getBytes("iso-8859-1");信息已丢失。

再执行String str = new String(bs,"任何charset");str已经不等于"你好"了,而是两个问号??。所以在Tomcat中我们会经常遇上中文变为一长串??????,就是源于此。

在iso-8859-1、utf-8、gbk中一个字节码表示一个英文字符,

在unicode编码中一个字节码并不能表示任何字符,而且规定必须是两个字节码(有时4个)才能表示一个字符。

说了这么多,也许很多人会问为什么要用这么多编码方式,统一成utf-8不就能表示所有字符了?

编码不仅仅是要考虑是否能表示任何字符,还要考虑传输和存储。

utf-8确实几乎能表示所有已知字符。前面说过在utf-8编码中3个字节才表示一个中文字符,这样显然占空间,不利于传输和存储(传输和存储都是以二进制的方式进行的)

无疑一个字节表示一个字符最省空间,比如iso-8859-1。但这世上不是只有英文字符,还有各个地区国家的文字。所以字符的数量肯定是大于2的8次方的。

所以结合以上两点,就自然地出现了很多种编码方式。

以上就是“WEB前端中文乱码是怎么产生的”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: web前端中文乱码是怎么产生的

本文链接: https://lsjlt.com/news/345498.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • web前端中文乱码是怎么产生的
    今天小编给大家分享一下web前端中文乱码是怎么产生的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。中文乱码的产生原因:解码方...
    99+
    2023-07-04
  • web前端中弹窗是怎么开发的
    这篇“web前端中弹窗是怎么开发的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“web前端中弹窗是怎么开发的”文章吧。状态驱...
    99+
    2023-07-05
  • web中大前端和小前端的区别是什么
    小编给大家分享一下web中大前端和小前端的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • web前端怎么上传文件
    这篇文章主要介绍“web前端怎么上传文件”,在日常操作中,相信很多人在web前端怎么上传文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”web前端怎么上传文件”的疑惑有所帮...
    99+
    2024-04-02
  • web前端中的web指什么
    本篇内容主要讲解“web前端中的web指什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web前端中的web指什么”吧! web是...
    99+
    2024-04-02
  • web前端怎么把文字靠右
    在Web前端开发中,对于文字排版的要求也是很高的,有时候需要把一些文字对齐到靠右边,那么如何实现呢?一、CSS属性text-align在CSS中,有一个text-align属性,它表示文字水平对齐方式。text-align有以下取值:lef...
    99+
    2023-05-20
  • web前端中CSS层叠上下文的方法是什么
    这篇文章主要讲解了“web前端中CSS层叠上下文的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端中CSS层叠上下文的方法是什么”吧!一、...
    99+
    2024-04-02
  • web前端的概念是什么
    这篇“web前端的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“web前端的概念是什么”文章吧。Web前端是给用户...
    99+
    2023-07-05
  • Redhat AS4终端中文乱码怎么解决
    本篇内容主要讲解“Redhat AS4终端中文乱码怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redhat AS4终端中文乱码怎么解决”吧!修改/etc/sysconfig/i18n文...
    99+
    2023-06-10
  • web前端中全路径指的是什么
    这篇文章主要讲解了“web前端中全路径指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端中全路径指的是什么”吧! ...
    99+
    2024-04-02
  • web前端中死循环指的是什么
    这篇文章主要介绍了web前端中死循环指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web前端中死循环指的是什么文章都会有所收获,下面我们一起来看看吧。死循环是指无法靠自身的控制终止的循环,是单一程序在...
    99+
    2023-07-05
  • web前端中表单的作用是什么
    这篇文章主要讲解了“web前端中表单的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端中表单的作用是什么”吧!表单的作用有两个:1、对于用户而言是数据录入和提交的界面;2、...
    99+
    2023-07-05
  • web前端开发中的函数是什么
    本篇内容主要讲解“web前端开发中的函数是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web前端开发中的函数是什么”吧!  函数  将代码编写在函数中,就可以避免在非必要情况下调用该代码,...
    99+
    2023-06-05
  • web前端架构指的是什么
    这篇文章主要讲解了“web前端架构指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端架构指的是什么”吧!web前端架构是一系列工具和流程的集合,旨在提升前端代码的质量,并实现...
    99+
    2023-07-05
  • web前端主要做的是什么
    随着互联网的不断发展,Web前端开发在技术领域中也变得越来越重要。Web前端是指通过HTML,CSS和JavaScript等技术构建和维护网站的任务。那么,Web前端主要做的是什么呢?在这篇文章中,我们将详细讨论Web前端的职责和工作内容。...
    99+
    2023-05-14
  • web前端是做什么的知识
    随着互联网的发展,Web前端开发成为一个越来越重要的职业。Web前端开发是指通过编写HTML、CSS、JavaScript等代码,实现页面的设计和交互效果,最终呈现出给用户的网页界面。从某种意义上来说,Web前端开发就是将网页设计师所绘制出...
    99+
    2023-05-20
  • PHP符号乱码产生的原因及解决方法是什么
    这篇文章主要介绍“PHP符号乱码产生的原因及解决方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP符号乱码产生的原因及解决方法是什么”文章能帮助大家解决问题。一、原因编码问题:PHP编程...
    99+
    2023-07-05
  • web前端中事件驱动指的是什么
    这篇“web前端中事件驱动指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“web前...
    99+
    2024-04-02
  • web前端中相对路径指的是什么
    这篇文章主要介绍“web前端中相对路径指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“web前端中相对路径指的是什么”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • web前端是做什么的?优势是什么?
    Web前端是指开发Web页面的技术和工具,也称作前端工程师。随着互联网的迅速发展,Web前端在互联网领域中变得越来越重要。这篇文章将讨论Web前端是做什么的,以及为什么Web前端在今天的互联网领域中如此重要。一、Web前端是做什么的Web前...
    99+
    2023-05-14
    web前端 web
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作