IE中打开UTF-8编码title为中文的网页会显示空白页的问题

本文详细探讨了静态页面在外网上无法正确显示的问题及其解决方案。主要原因是内外网服务器的编码格式不同,导致页面虽能加载但无法正常显示。文章介绍了如何通过设置IO流的编码格式来解决这一问题。

程序生成的静态页面,在内网测试时完全正常,当放到外网后生成的静态页面可以load下代码但不显示页面。郁闷了2天....今天终天在网上找到问题的原因了。原因:因为IO流没有设置编码,内网服务器的编码是GB2312,而外网是则是UTF-8,所以在外网生成的静态页面虽然在http头中标示了GB2312,还是不能显示。解决办法,PrintWriter myFile =new PrintWriter(new OutputStreamWriter(new FileOutputStream(文件名),"gb2312"));

 

以下为转:http://yskin.net/2006/08/ie-utf-8-bug.html

浏览器(无论是IE还是Firefox)在解析页面时,首先取HTTP Header中的Content-Type项,如果有写明charset的话就认定页面的编码方式为charset指定的值。如果没有指明,则认定为默认值。IE中文版的默认值是GB2312,Firefox中文版的默认值是GBK,不过IE的GB2312好像和GBK没啥区别。然后,浏览器会看一下有没有BOM。一旦发现有UTF-8的3字节BOM,则重新认定页面的编码方式为UTF-8。

然后是解码阶段,解码完成后是解析html的阶段。解析html的过程中,当解析到head部分的meta标签时,浏览器会根据<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />这个语句中的说明,重新认定编码方式为charset后面的方式,中断html解析过程,返回到解码步骤重新解码。

知道了这个步骤,再来看这个表:在加了Header语句设置了HTTP Header后,两个浏览器解析所有页面都是用的UTF-8方式,包括GBK编码的页面。(当然要正常解析GBK编码的文件,可以在title前加上个meta标签标明编码方式。)在上表的下半部分可以清楚的看到这一点。再来看上半部分,在没有加Header语句的页面里,首先浏览器认定页面编码方式为默认值GBK。检测有无UTF-8的3字节BOM,检测到的,认定页面编码方式为UTF-8,解码再解析html,一切正常。如上表所示,上半部分带BOM的页面都能正常显示。如果没有BOM,页面可能是GBK或者UTF-8(no BOM)格式,浏览器会先按照默认的GBK方式开始解码。页面为GBK格式时,无meta时正常,有meta时浏览器解析到meta标签会回头重现按UTF-8方式解码,所以GBK,meta在前或后,无论IE还是FF都是乱码。再看UTF-8(no BOM)的页面,无meta时FF用GBK方式解码下去,最终显示乱码,IE则解码出错,形成空白页。有meta时,Firefox找到meta后回头重新按UTF-8方式解码,所以无论meta在前或在后都是正常;IE则是在meta在前时能够和Firefox一样回头重新解码,当meta在后时,又是解析到title出错,返回空白页。

所以,IE显示空白页的问题,很明显是因为IE的解码程序兼容性差。上网查了下,GBK的编码范围是0×8140-0xfefe。从GB2312-80开始,因为ASCII码的范围是0~127,首字位是0,所以GB2312-80使用双字节,并设置首字位为1。“GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间。”UTF-8中中文都是3个字节的,由于Unicode中中日韩的文字都混在一起,可以使用Windows自带的字符映射表查看CJK表意字符的范围,即为汉字的范围。(可以参考我的里的图片)3字节的UTF-8编码是这样子的:1110xxxx 10xxxxxx 10xxxxxx,编码范围是8000-EFFF,首字节在80-EF之间,尾字节在00-FF之间。显然当一段UTF-8编码的文本被按照GBK方式解码的时候,由于有一些编码在GBK中不存在,造成解码程序出现错误。当UTF-8文本被按照GBK的方式解码的时候,前两个字节会被认为是一个字,后一个字节将和下一个字符结合。当<title>标签里的汉字数是偶数个时,勉强有3/4的概率通过解码程序(因为GBK的第二个字节要求是40-FE),当有奇数个汉字的时候,最后一个汉字的三个字节的最后一个字节会和</title>的第一个字符<结合,而<的编码是3C,正好不在尾字节40-FE的范围中,造成错误。如果</title>标签前有多余的空格也会产生错误,因为空格的编码20也不在范围中。

关于BOM

    BOM全称是Browser Object Model,在不依赖于网页内容的情况下提供和浏览器视窗交互的对象,下图显示了BOM的组成结构。

 

可以看出,window是BOM的核心对象,在使用window中所有对象时,可以省去window,例如window.document可以写成document,window.frames[0]可以写成frame[0]。为了对视窗进行操作,BOM提供了四种方法:moveBy(dx,dy)、moveTo(x,y)、resizeBy(dw,dh)、resizeTo(w,h),这四种方法比较简单,具体使用可以参考相关资料。

    BOM中没有特别复杂的概念,但需要注意的是,现在BOM还没有一个统一的标准,各种浏览器对BOM的支持程度也不一,相同的功能也许其对象描述并不相同,即使是BOM结构本身也存在问题,如location既存在于window下的第二级结构中,也存在于window.document下的第三级结构中,但它们的功能描述是相同的。在目前情况下,只有针对用户所使用的浏览器来定制代码,或为不同的浏览器分别进行代码描述。

 

涉及到IO流,问题可能是用unicode为导向的FileWrite写文件。

在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:
1.1 以字节为导向的stream
以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:
1) input stream:
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream:把一个String对象作为InputStream
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream:把多个InputStream合并为一个InputStream
2) Out stream
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用
4) SequenceOutputStream:把多个OutStream合并为一个OutStream
1.2 以Unicode字符为导向的stream
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:
1) Input Stream
1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应
2) Out Stream
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。

 

内容概要:本文围绕“新能源发电接入弱电网的宽频带振荡机理及抑制方法”开展深入研究,依托Matlab/Simulink平台完整复现了相关博士论文的核心内容。研究聚焦于新能源并网系统在弱电网条件下引发的宽频带振荡问题,通过构建光伏并网逆变器、虚拟同步发电机(VSG)等关键设备的精确动态模型,采用阻抗建模、序阻抗分析、扫频法和小信号稳定性分析等先进理论工具,系统揭示了锁相环、电流控制环与电网阻抗之间复杂的动态交互机制及其诱发不稳定振荡的内在机理。在此基础上,提出了包括自适应控制、虚拟阻抗、增益调度等多种针对性的抑制策略,并通过详尽的仿真验证了其有效性。该资源不仅提供了核心研究成果的复现代码与模型,还整合了大量电力系统稳定性、微电网优化、智能算法应用等领域的配套案例,构成一套体系完整、理论与实践紧密结合的高水平科研参考资料。; 适合人群:具备电力系统分析、新能源并网技术、自动控制理论等专业知识背景,熟练掌握Matlab/Simulink仿真工具的研究生、高校科研人员及电力电子与电力系统领域的工程技术人员。; 使用场景及目标:① 深入探究新能源并网系统在弱电网环境下面临的稳定性挑战与宽频带振荡的产生根源;② 系统学习并掌握阻抗建模、扫频分析等现代电力电子系统稳定性评估的关键技术与方法论;③ 实践复现高水平学术论文(特别是博士论文)中的复杂模型与核心结论,为自身的课题研究、论文撰写与项目攻关提供坚实的理论依据和技术验证;④ 借助丰富的配套案例资源,进行新算法开发、模型优化与综合技术方案的设计与测试。; 阅读建议:建议读者结合文中提供的网盘链接,下载完整的Matlab代码与Simulink仿真模型进行动手实践。在学习过程中,应着重关注核心模型的搭建逻辑、参数设计依据以及不同控制策略的实现细节,通过主动修改系统参数、切换控制方案等方式进行对比仿真分析,从而深刻理解理论分析、数学模型与实际仿真结果之间的内在联系,充分发挥该资源在科研学习与技术创新中的最大价值。
这个是完整源码 python实现 大数据 Spark pyspark 可视化大屏+Kafka+FastAPI+Vue3 【大数据毕业设计】基于Spark实时电商用户行为分析与预测(Python版本+pyspark+可视化大屏+Kafka+FastAPI+Vue3) 源码+论文 完整版 数据库Mysql 随着微博、抖音、知乎、小红书等社交媒体的快速发展,网络舆情呈现出数据规模大、传播速度快、情感变化剧烈等特点。传统基于离线批处理的舆情分析方法难以满足“秒级感知、分钟级研判”的业务需求。针对上述问题,本文设计并实现了一套基于 Spark 的实时社交媒体舆情分析与趋势预测系统。系统采用前后端分离架构:前端基于 Vue3、Element Plus 与 ECharts 构建管理后台和可视化大屏;后端基于 Python 与 FastAPI 提供统一 REST API;消息层引入 Kafka 承接高并发舆情事件流;计算层使用 Spark Streaming(Structured Streaming)完成按小时窗口的帖文量、独立用户数、正中负情感分布与热度指数聚合;预测层基于 Spark ML 线性回归,结合滞后热度特征与小时特征,对舆情热度进行趋势预测,并以 RMSE、MAE、MAPE 评估模型误差。数据持久化采用 MySQL,数据库名为 db_social_opinion。系统还设计了 Kafka/Spark 不可用时的 pandas 与 scikit-learn 降级方案,保证演示与实验环境的可用性。测试结果表明,系统能够稳定完成舆情数据采集、实时统计、趋势预测与可视化展示,功能完整、结构清晰,达到本科毕业设计要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值