中文乱码的原因及解决方法

2023-10-31

1、我们常用的编码表:

  ASCLL:美国标准信息交换码

     --->用一个字节的7位可以表示

ISO8859-1:拉丁码表、欧洲码表

    --->用一个字节的8位来表示

GB2312:中国的中文编码表

GBK:中国的中文编码表的升级。

      --->一个汉字用两个字节表示,每个字节的高位是1,所以汉字的byte形式是负数。

Unicode:国际标准码,融合了多种文字。

UTF-8:最多用三个字节表示一个字符

2、编码表的编码和解码步骤:

2.1先来了解下编码和解码的概念

  编码:字符串变成字节数组
  解码:字节数组变成字符串
  即:
  编码:String-->byte数组,str.getBytes();
  解码:byte-->String

2.2  GBK编码的转换流程

String str = "上海";
		byte[] b = str.getBytes();
		System.out.println(Arrays.toString(b));
		String s = new String(b,"gbk");
		System.out.println(s);


系统默认的编码是gbk编码,当调用getBytes()方法之后,“上海”二字转换成长度为4的字节数组,这里是编码的过程。

当new String(b,"gbk")时,用的是gbk的解码方式。所以能够解析出相应的汉字。若使用utf-8,那么就会出现中文乱码。

因此,解决中文来乱码的关键点 在于编码表的对应

演示编码不一致产生的中文乱码问题:

String str = "上海";
		byte[] b = str.getBytes("utf-8");
		System.out.println("汉字:"+str+"utf-8编码形式:"+Arrays.toString(b));
		String s = new String(b,"gbk");
		System.out.println("与之对应的gbk解码形式:"+s);

       由上面可以看出来:一个utf-8编码方式的汉字占用3个字节,而gbk编码方式占用2个字节。

3、产生ISO8859-1的中文乱码的解决方法:

   产生问题:

String str = "上海";
		byte[] b = str.getBytes();
		System.out.println("汉字:"+str+"gbk编码形式:"+Arrays.toString(b));
		String s = new String(b,"iso8859-1");
		System.out.println("与之对应的iso8859-1解码形式:"+s);

一个ISO8859-1编码占用一个字节。

解决方法:将乱码按照iso8859-1的编码格式重新编码,产生的编码还是那些字节数组[-55,-49,-70,-93],然后将这些字节数组按照GBK编码进行解码。

代码如下:

String str = "上海";
		byte[] b = str.getBytes();
		System.out.println("汉字:"+str+"gbk编码形式:"+Arrays.toString(b));
		String s = new String(b,"iso8859-1");
		System.out.println("与之对应的iso8859-1解码形式:"+s);
		byte[] b1 = s.getBytes("iso8859-1");
		System.out.println(s+"与之对应的iso8859-1编码形式:"Arrays.toString(b1));
		String s1 = new String(b1,"gbk");
		System.out.println(s1);
4、客户端与Tomcat之间产生的中文乱码

所以需要将ISO8859-1产生的中文乱码进行编码再解码。

即:new Stirng(b.getBytes("iso8859-1","gbk"));

若采用的是UTF-8编码,

 new String(b.getBytes("iso8859-1"),"utf-8");



以上是今天学到的一些内容之前在做网站时,一直会出现这些中文乱码的问题,尽管一些问题解决了,但是不了解这些问题的原因,今天在这里总结一下这些内容。自己能够进一步的了解,也希望对大家起到作用。






 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

中文乱码的原因及解决方法 的相关文章

  • java - 使用 Apache PDFBox 生成 unicode pdf

    我必须在我的 spring mvc 应用程序中生成 pdf 最近我测试了iTextPdf 库 http itextpdf com 但我无法生成 unicode pdf 文档 事实上 我在生成的文档中没有看到非拉丁字符 我决定使用 Apach
  • 如何在 Java 中对 HTTP 请求中的西里尔字母进行编码?

    美好时光 我的 Adroid 应用程序向 Google 的 API 服务之一执行 HTTP 请求 当然 当请求的参数是英文时 它可以工作 但是当我用西里尔文测试我的函数时 我收到 400 错误 似乎问题是将 Win 1251 字符串编码为
  • 完全匹配where子句mysql中utf8中的单词

    我有一个这样的查询 SELECT FROM category keyword WHERE keyword cho 本次查询返回结果keyword cho ch ch ch 我只希望结果是 keywords cho 而不是 ch ch 我能怎
  • 处理包含“问号”(�) 的字符串时出现编码问题

    我正在解析响应中的一些网页内容HttpWebRequest 该网页内容正在使用字符集ISO 8859 1当解析它并最终从响应中得到所需的单词时 我收到了string带有这样的问号 我想知道将其转换回可读的正确方法string 所以 我尝试的
  • 是否可以构造一个utf-8编解码器无法编码的unicode字符串?

    是否可以构造一个 unicode 字符串utf 8编解码器无法编码 从文档 https docs python org 2 library codecs html https docs python org 2 library codecs
  • 当存在 UTF-8 字符编码时,显示引号的问号图标

    由于某种原因 我添加后 在我的头标签之间 某些符号 即引号 显示为中间带有问号的菱形图标 就好像没有找到该符号一样 有人知道怎么回事吗 您的文本编辑器正在以某种非 UTF 8 很可能是 CP1252 的编码保存文件 包括引号 将文件实际转换
  • 什么是 Unicode、UTF-8 和 UTF-16?

    Unicode 的基础是什么 为什么需要 UTF 8 或 UTF 16 我在谷歌上研究过这个问题 也在这里搜索过 但我不清楚 In VSS https en wikipedia org wiki Microsoft Visual Sourc
  • 将 UTF-8 编码的转储加载到 MySQL 中

    昨天我为这个问题苦苦思索了几个小时 我在 MySQL 4 1 22 服务器上有一个数据库 编码设置为 UTF 8 Unicode utf8 如 phpMyAdmin 报告 该数据库中的表的默认字符集设置为latin2 但是 使用它的 Web
  • C 中的 UTF8 处理

    我对UTF8有基本的了解 码点的长度是可变的 所以一个 字符 可以是8位 16位 甚至更长 我想知道 C 语言中是否有一些示例代码 库等可以与 UTF8 字符串 如 C 中的标准库 执行类似的操作 告诉字符串的长度等 Thanks GNU
  • 使用 XSLT 转换 XML 并保留 Unicode 字符

    我的 XSLT 转换已经成功了几个月 直到我遇到带有 Unicode 字符 很可能是表情符号 的 XML 文件 我需要保留 Unicode 但 XSLT 正在将其转换为 HTML 实体 我认为将编码设置为 UTF 8 可以解决我的问题 但我
  • 将 MySQL 查询的输出转换为 utf8

    我的数据库中有一个表 我想运行如下查询 SELECT column1 column2 FROM my table WHERE my condition 但我希望 mysql 返回column2以utf8编码 mysql中有什么函数可以完成这
  • 编写无 BOM 的 UTF-8

    这段代码 OutputStream out new FileOutputStream new File C file test txt out write A getBytes 和这个 OutputStream out new FileOu
  • Windows命令行参数编码是什么?

    Windows 使用什么编码来传递给在 cmd exe 窗口中启动的程序的命令行参数 命令行参数的编码似乎不受使用控制台代码页设置的影响chcp 我将其设置为 UTF 8 代码页 65001 并使用 Lucida Console 字体 如果
  • 如何在经典 ASP 中将 Windows-1255 转换为 UTF-8?

    如何将 windows 1255 字符串转换为 utf 8classic应用服务提供商 我的数据库是 windows 1255 我想将我的网站转移到 utf 8 代码是否在这个答案 https stackoverflow com quest
  • UTF-8 和 Unicode,0xC0 和 0x80 是什么意思?

    在过去的几天里 我一直在阅读有关 Unicode 和 UTF 8 的内容 并且经常遇到与此类似的按位比较 int strlen utf8 char s int i 0 j 0 while s i if s i 0xc0 0x80 j i r
  • 如何在 Windows 上的 PostgreSQL 中创建具有 UTF-8 排序规则的数据库?

    我正在为 Windows 上的 Bitbucket 服务器配置 PostgreSQL 数据库 在官方guide https confluence atlassian com bitbucketserver connecting bitbuc
  • python 2.7 字符 \u2013 [重复]

    这个问题在这里已经有答案了 我有以下代码 coding utf 8 print u William Burges 1827 81 was an English architect and designer 当我尝试从cmd运行它时 我收到以
  • 如何在PHP中设置文本文件编码?

    如何在 PHP 中设置文本文件编码 例如 UTF 8 让我告诉你我的问题 这是我的代码 Output fwrite 具有类似的输出 但是当我创建test txt通过记事本并设置字符集UTF 8输出就是我想要的 我想在 PHP 文件中设置字符
  • 是否可以让 SQL Server 将排序规则转换为 UTF-8 / UTF-16

    在我正在处理的一个项目中 我的数据存储在 SQL Server 中 并具有排序规则Danish Norwegian CI AS 数据通过 FreeTDS 和 ODBC 输出到将数据作为 UTF 8 处理的 python 一些字符 如 和 编
  • Navicat utf8 不适用于 mysql 数据库

    我目前正在尝试合并两个不同步的表达式引擎数据库之间的数据更改 为此我选择使用 navicat 该网站在模板中大量使用希腊字符集 当我在 phpmyadmin 中查看希腊语表字段数据时 我按预期看到了希腊语字符 当我将它们加载到 Navica

随机推荐

  • R手册(Common)--面向对象(R6 and S4)

    R 主要面向统计计算 似乎很少会用到面向对象的编程方法 但在统计计算中 在下列情形中使用面向对象的编程方法可以编程更有效率 文章目录 面向对象R6类 面向对象S4类 自定义S4类 实例化函数 S4的泛型函数 面向对象R6类 R 的面向对象
  • Java实现图灵机XNx2

    题目要求 程序实现图灵机XNx2的功能 1 程序风格良好 使用自定义注释模板 2 提供友好的输入输出 并进行输入数据的正确性验证 语言环境 eclipse java 算法设计 程序代码 Number类 import java util Sc
  • 阿里p8架构师耗时一年整理SpringBoot,从构建小系统到架构大系统

    Java 的各种开发框架发展了很多年 影响了一代又一代的程序员 现在无论是程序员 还是架构师 使用这些开发框架都面临着两方面的挑战 一方面是要快速开发出系统 这就要求使用的开发框架尽量简单 无论是新手还是老手都能快速上手 快速掌握页面渲染
  • 目标检测的中的指标的含义及其实现

    目录 一 Precision和Recall 二 IoU Intersection over Union 三 top5 top1 四 Average Precision 五 COCO数据集的评价指标 1 Average Precision A
  • 太全了——用Python操作MySQL的使用教程集锦

    一 python操作数据库介绍 Python 标准数据库接口为 Python DB API Python DB API为开发人员提供了数据库应用编程接口 Python 数据库接口支持非常多的数据库 你可以选择适合你项目的数据库 GadFly
  • Abaqus打开失败FLEXnet Licensing error:-15,10. System Error: 10061 “WinSock: Connection refused“

    好久没用电脑上的abaqus 今天一点启动就出现如下问题 Cannot connect to license server system The license server manager lmgrd has not been start
  • Java如何设置过期时间的map

    大神封装的挺好用的 package com kufang uselocal utils import java util Title ExpiryMap 可以设置过期时间的Map description ExpiryMap继承至HashMa
  • [OPENAI2021力作][CLIP: Connecting Text and Images]

    本文翻译自OpenAI官方博客 1 于2021年1月5日发布 0 前言 本博客是openAI的大佬们的全新作品 其提出了可以用于从自然语言监督信号中有效提取视觉信息的 名为CLIP的神经网络 CLIP可以被用于任何视觉分类的benchmar
  • docker K8s部署

    docker K8s部署 docker build t www aaa cn pro admin 20230202 1703 docker images docker login www aaa cn U username P passwo
  • 码云出现错误git@gitee.com: Permission denied (publickey). fatal: Could not read from remote repository. P

    第一步 重新生成ssh ssh keygen t rsa C 这里需要填写邮箱 我填写的是我的绑定主邮箱 我想其他邮箱也是可以的 只不过我没有测试 第二步 查看你生成的公钥 cat ssh id rsa pub 然后我们就可以看到我们的公钥
  • Glide:4.8.0基础使用

    参考 https blog csdn net mars314 article details 80653795 首先 添加依赖 implementation com github bumptech glide glide 4 8 0 ann
  • 微信小程序授权登陆页面

    1 在进入小程序的时候要判断是否有授权 如果没有授权 则要先授权之后 才能登陆到小程序的首页 刚开始 我把login页当作了小程序的首页 这样导致如果已经授权过 这个页面也会一闪而过 用户体验不好 捋了一下思路之后认为 应该把授权的判断放在
  • 华为OD机试 C++【 数据最节约的备份方法】

    描述 你有一堆文件需要备份 但你只有一些500MB的光盘 你的任务是弄清楚 为了备份所有文件 你最少需要多少张光盘 核心要点 每个文件的大小都是整数MB 而且不会超过500MB 文件不能被拆分来备份 给我数据 文件的大小 如 100 500
  • java基础练习题

    1变量 运算符和类型转换 1 1手动输入一个学生的成绩 对这个成绩进行一次加分 加当前成绩的20 输出加分后成绩 Scanner scan new Scanner System in System out println 请输入一个数字 i
  • [Codeforces] combinatorics (R1600) Part.5

    Codeforces combinatorics R1600 Part 5 题单 https codeforces com problemset tags combinatorics 1201 1600 1096B Substring Re
  • 【问答23】Linux移植:如何制作rootfs?

    粉丝问题 如何制作rootfs 安排 想直奔主题的 直接跳到第四章 一 分析 1 文件系统简介 理论上说一个嵌入式设备如果内核能够运行起来 且不需要运行用户进程的话 是不需要文件系统的 文件系统简单的说就是一种目录结构 由于 linux操作
  • python os.mkdir与os.makedirs递归创建目录

    os mkdir创建单层目录 usr bin python coding UTF 8 import os sys 创建的目录 path tmp home monthly daily hourly os mkdir path 0755 os
  • [ESP32C3填坑] AT指令不应答

    烧录固件 固件连接 发布的固件 ESP32 C3 ESP AT 用户指南 latest 文档 espressif com 然后选择 v2 4 2 0 ESP32 C3 MINI 1 AT V2 4 2 0 zip这个版本 再下载烧录软件 工
  • 外观模式(Facade)

    设计模式之外观模式 外观模式的作用 为复杂的系统提供高层的接口 程序这个东西总是会变的越来越大 随着时间的推移 程序中的类会越来越多 而且它们之间相互关联 这会导致程序结构也变得越来越复杂 随之也会使得我们在使用这些类之前 必须弄清楚它们之
  • 中文乱码的原因及解决方法

    1 我们常用的编码表 ASCLL 美国标准信息交换码 gt 用一个字节的7位可以表示 ISO8859 1 拉丁码表 欧洲码表 gt 用一个字节的8位来表示 GB2312 中国的中文编码表 GBK 中国的中文编码表的升级 gt 一个汉字用两个