中文乱码的那些事儿(一)中基本没提及任何乱码的事情,被骂标题挡了,本篇主要侧重乱码问题的排查过程,讨论一下处理这类问题的思路。
一次典型的B/S结构的Web请求过程大概是下面这个样子的:
浏览器发起request(第一次Encode,将待发送的数据通过某种字符编码编码为字节流) -------> 服务器接收请求(第一次Decode,如果此时使用了和浏览器端不一致的字符编码进行解码,则有可能在这一时刻产生乱码)-------> 服务器内部业务逻辑处理(这里如果涉及DB交互,则这里还有一次编码解码过程,不过以下讨论忽略这种情况,简化问题,分析的思路是一致的) -------> 服务器发送response给浏览器(第二次Encode,涉及到字符编码) -------> 浏览器接受到HttpResponse进行解码页面渲染(第二次Decode,再一次涉及字符编码)
从这个简化的过程可以看出,只要上面任何一对编码解码的字符编码不一致,都有可能造成乱码(这里说有可能是因为如果你刚好使用了一个可以完全兼容编码字符集的字符集进行解码,那么你可能很幸运的没遇到乱码问题,前提条件是编码字符集能够涵盖你发送的所以字符,不会在编码那一刻造成信息丢失)。
下面分别来看一下这几个环节的细节:
- 第一次Encode:浏览器发出的常用请求,主要是POST和GET两种。对于这两种请求,如果是通过form形式提交的,那么字符编码的最高优先级是遵守form中accept-charset属性的值。但在实际网页中,很少有人使用这个属性,事实上,通常情况下,你也没有理由单独为文本形式提交的form规定一个单独的字符编码进行编码。在这个属性不存在的情况下,HTTP的Response的Header中的Content-Type会作为网页提交的默认字符编码;如果这个也不存在,那么浏览器会选择网页中head标签中的
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
作为字符编码。如果这个也找不到呢?那只能说明这个网页是在太尼玛不规范了,浏览器也不忍了,直接自己决定,通常这种情况会使用默认的操作系统字符集。对于非form的普通GET请求,基本也是遵循这个优先级套路的。但是,上面主要是个理论依据,在乱码问题排查时,最好的方式还是通过实践确认这个第一步编码使用的到底是啥编码,这个至关重要,会作为后续分析的一个重要依据。在Firefox和Chrome中,想获得这个信息太容易了,只要你在提交请求之前,打开相应的监控插件就可以了。如果你非得使用比较老版本的IE进行调试,那开个Fiddler也行的。 - 第一次Decode:这次Decode发生在字节流已经成功发送到Server端(好吧,这里我们再次忽略了Http服务器,比如Apache,插手解码的过程,因为这个也确实不常见,通常他会直接做一个反向代理的转发到他后面的Web服务器)。这时,Web服务器需要进行解码了。注意,这里可能产生乱码了。这时你会惊呼:“尼玛,我明明用UTF-8编码的,为啥这里用UTF-8进行解码出来一坨乱码!”。如果你在上面一步确实通过实践证明了浏览器在发送之前使用的是UTF-8进行了编码,并且这一步是网络传输之后的第一次解码环节,那么问题就找到了,你使用了非UTF-8解码。于是你兴高采烈的在你使用Request.getParameter("XXX")之前,加入了一句Request.setCharacterEncoding("UTF-8"),然后重新编译代码等待见证奇迹。然后,我和我的小伙伴们都惊呆了,因为乱码还尼玛依旧是乱码。为啥?为啥设置的编码没生效?因为Request的解码动作是在第一次调用它的getParameter方法时发生的,且在一次Request的周期中,只发生这一次(想想也合理,如果是你实现这个方法,也不可能每次都去重新Decode一遍字节数组吧)!这点很重要,了解了这点,一种合理的解释就是,你手动触发的getParameter("XXX")并不是第一次这个方法的调用。至于是谁更早的调用了这个方法,这个通常跟你使用Web框架有关系。通常在框架级别,出于安全、适配等方面的考虑,很有可能在你的业务代码之前已经把你Request中的paramter已经先轮了一遍了。那你要做的就是想尽办法你上面的那句设置编码的Code放到最近前面就好了。一种可行的方案是你编写一个Servlet的Filter专门干编码设置这件事情,并且把它放置到所有Filter的最前面(通过配置filter-mapping标签在web.xml中的顺序来实现)。事实上,Spring框架中提供的org.springframework.web.filter.CharacterEncodingFilter就干了这么一件事。以上这个过程你可以通过IDE提供的Debug或者调试Log等手段加以验证。
- 第二次Encode:话说上面两步都没问题,那你就得确定在你Response回去的时候,使用的字符编码是不是你所期望的了。比较保险的做法通常是在你对Response有任何写操作之前,设置好他的编码。也就是在最开始就设置好Response的字符编码,这个在Servlet的API中,可以对应到Response.setCharacterEncoding("XXX")。
- 第二次Decode:回到这一步,已经到页面展示的最后一公里了。如果通过上面步步为营的排查,确保每一步都没问题,到这一步还是有乱码,那八成就是浏览器用了错误的编码解析了网络回传回来的字节流。那怎么排查?单独这一步其实好验证,因为绝大部分浏览器都支持让你手动选择使用神马字符编码解码。最快的验证方式就是把常用的那几个字符编码快速验证一下,通常你可以通过这种方式找到正确的解码字符集。剩下的就是看看浏览器为啥没有按照正确的字符集进行解码了。其实如果你正确的完成了上一步所说的所有步骤的话,在Server端返回的HTTP的Header中就会明确的有Content-Type这个属性。所以这一步其实差不多和上一步是一个互相验证的过程。
好了,当你已经完成上面提到的几步的排查过程,可能你的乱码问题就解决了。当然也可能没有。上面毕竟仅仅描述了一种比较典型的Web交互过程,实际的交互过程完全有可能更为复杂,完全有可能进行更多次的编码解码。但是上面列出的排查问题的过程还是具有普世意义的:找到你的字符在整个过程中究竟有多少地方进行了编码和解码,然后从第一个编码的地方开始,通过各种工具或者Debug的手段开始确认,找到最先出现乱码的地方,然后解决。然后再实验问题是否得到解决。
相关推荐
在 Java 开发中,如果框架搭建的不完善或者初学者在学习过程中,出现中文乱码是经常的事儿。那么,为什么会出现中文乱码呢?原因是 Http 请求传输时将 URL 以 ISO-8859-1 编码,服务器收到字节流后默认会以 ISO-8859...
最近遇到个恶心的事儿,就使用死丢丢的时候,发现怎么我的控制台输出中文都显示方框???别人都没事,恶心坏我了。经过各种百度,终于找到解决办法,办法也是够恶心的。我们一起来看看吧。 乱码显示结果如下: ...
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
# 基于Python的KMeans和EM算法结合图像分割项目 ## 项目简介 本项目结合KMeans聚类和EM(期望最大化)算法,实现对马赛克图像的精准分割。通过Gabor滤波器提取图像的多维特征,并利用KMeans进行初步聚类,随后使用EM算法优化聚类结果,最终生成高质量的分割图像。 ## 项目的主要特性和功能 1. 图像导入和预处理: 支持导入马赛克图像,并进行灰度化、滤波等预处理操作。 2. 特征提取: 使用Gabor滤波器提取图像的多维特征向量。 3. 聚类分析: 使用KMeans算法对图像进行初步聚类。 利用KMeans的聚类中心初始化EM算法,进一步优化聚类结果。 4. 图像生成和比较: 生成分割后的图像,并与原始图像进行比较,评估分割效果。 5. 数值比较: 通过计算特征向量之间的余弦相似度,量化分割效果的提升。 ## 安装使用步骤 ### 假设用户已经下载了项目的源码文件 1. 环境准备:
HCIP第一次作业:静态路由综合实验
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
内容概要:本文详细介绍了Johnson-SU分布的参数计算与优化过程,涵盖位置参数γ、形状参数δ、尺度参数ξ和伸缩参数λ的计算方法,并实现了相应的Python代码。文中首先导入必要的库并设置随机种子以确保结果的可复现性。接着,分别定义了四个参数的计算函数,其中位置参数γ通过加权平均值计算,形状参数δ基于局部均值和标准差的比值,尺度参数ξ结合峰度和绝对偏差,伸缩参数λ依据偏态系数。此外,还实现了Johnson-SU分布的概率密度函数(PDF),并使用负对数似然函数作为目标函数,采用L-BFGS-B算法进行参数优化。最后,通过弹性网络的贝叶斯优化展示了另一种参数优化方法。; 适合人群:具有Python编程基础,对统计学和机器学习有一定了解的研究人员或工程师。; 使用场景及目标:①需要对复杂数据分布进行建模和拟合的场景;②希望通过优化算法提升模型性能的研究项目;③学习如何实现和应用先进的统计分布及优化技术。; 阅读建议:由于涉及较多数学公式和编程实现,建议读者在阅读时结合相关数学知识,同时动手实践代码,以便更好地理解和掌握Johnson-SU分布及其优化方法。
TSP问题的3种智能优化方法求解(研究生课程《智能优化算法》结课大作业).zip
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
自动发布Java项目(Tomcat)Shell脚本
# 基于webpack和Vue的前端项目构建方案 ## 项目简介 本项目是基于webpack和Vue构建的前端项目方案,借助webpack强大的打包能力以及Vue的开发特性,可用于快速搭建现代化的前端应用。项目不仅完成了基本的webpack与Vue的集成配置,还在构建速度优化和代码规范性方面做了诸多配置。 ## 项目的主要特性和功能 1. 打包功能运用webpack进行模块打包,支持将scss转换为css,借助babel实现语法转换。 2. Vue开发支持集成Vue框架,能使用Vue单文件组件的开发模式。 3. 构建优化采用threadloader实现多进程打包,cacheloader缓存资源,极大提高构建速度开启热更新功能,开发更高效。 4. 错误处理与优化提供不同环境下的错误映射配置,便于定位错误利用webpackbundleanalyzer分析打包体积。
Hands-On Large Language Models - Jay Alammar 袋鼠书 《动手学大语言模型》PDF
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
# 基于Arduino Feather M0和Raspberry Pi的传感器数据采集与监控系统 ## 项目简介 本项目是一个基于Arduino Feather M0和Raspberry Pi的传感器数据采集与监控系统。系统通过Arduino Feather M0采集传感器数据,并通过WiFi将数据传输到Raspberry Pi。Raspberry Pi运行BalenaOS,集成了MySQL、PHP、NGINX、Apache和Grafana等工具,用于数据的存储、处理和可视化。项目适用于环境监测、物联网设备监控等场景。 ## 项目的主要特性和功能 1. 传感器数据采集使用Arduino Feather M0和AM2315传感器采集温度和湿度数据。 2. WiFi数据传输Arduino Feather M0通过WiFi将采集到的数据传输到Raspberry Pi。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
# 基于Arduino的WiFi按钮项目 ## 一、项目简介 本项目是一个基于ESP8266芯片的Arduino项目,主要实现WiFi连接、电压检测、LED灯控制以及向服务器发送POST请求等功能。通过简单的按钮操作,可以实现与服务器通信并获取相关信息,同时能检测电池电压并提示用户。 ## 二、项目的主要特性和功能 1. WiFi连接项目能够自动连接到指定的WiFi网络。 2. 电压检测通过ADC(模数转换器)检测电池电压,并在电压低于阈值时发出警告。 3. LED灯控制通过控制LED灯的亮灭来提示用户不同的状态信息(如连接成功、电压低等)。 4. 服务器通信项目可以向指定的服务器发送POST请求并处理返回的HTTP响应。 ## 三、安装使用步骤 1. 环境准备确保已安装Arduino IDE和ESP8266插件。 2. 下载源码下载项目的源码文件并解压。 3. 打开项目在Arduino IDE中打开解压后的main.cpp文件。