程序生成的静态页面,在内网测试时完全正常,当放到外网后生成的静态页面可以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使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。
分享到:
相关推荐
将文件从其他编码格式转换为UTF-8时,可能会在文件开头自动生成一个BOM(Byte Order Mark)标记。BOM标记可能导致浏览器在显示中文时出现乱码。移除BOM标记的方法包括: - 使用Dreamweaver打开文件并重新保存; -...
在Web开发中,UTF-8编码是一个至关重要的概念,它是一种广泛使用的字符编码标准,能够支持全球大部分语言的字符表示。以下是对Web开发中遇到的UTF-8问题的详细总结: 1. HTML页面转UTF-8编码问题: - 在HTML文件的...
在Windows环境下使用Internet Explorer(IE)浏览器时,由于IE在解析UTF-8编码的网页时可能会出现问题,尤其是在页面`<title>`标签内有奇数个全角字符时。这是因为IE解析时优先考虑HTML内的编码标签,而非HTTP头部...
为了在MySQL数据库中正确存储和检索UTF-8编码的中文字符,需要将数据库的编码设置为UTF-8。通常,这涉及到修改数据库的字符集设置,确保表和字段的字符集均为UTF-8。不正确配置的数据库会导致中文字符显示错误。 第...
对于UTF-8编码的字符串来说,由于不同字符(如中文、英文等)在UTF-8编码下占用的字节数不同,简单的按字节长度进行截取往往会导致乱码或者截取不准确。因此,需要一种能够等宽度截取中英文字符的方法。 #### 二、...
在实际工作中,我们经常会遇到不同编码格式的数据文件,特别是在处理中文字符时,由于不同的编码方式会导致显示异常,因此掌握如何进行编码转换是非常重要的技能之一。本文主要介绍如何将UTF-8编码的Access数据库...
1. **源文件编码不匹配**:当你在文本编辑器(如记事本)中创建HTML文件并使用UTF-8编码保存,但文件实际被以其他编码(如GBK或GB2312)打开时,就会出现乱码。记事本默认可能会将新文件保存为ANSI编码,这与UTF-8不...
综上所述,解决UTF-8编码网页不显示和乱码问题的方法需要从客户端和服务器端两方面来考虑。客户端方面应关注浏览器设置,而服务器端则需重视程序编码设置、文件保存格式以及程序代码的正确性。通过这些方法的综合...
在Eclipse中,确保项目属性设置中的源文件编码和输出文件编码都设置为UTF-8。如果遇到乱码问题,检查以下几个方面: - 模板文件的编码是否为UTF-8。 - Java代码中指定的编码是否正确,如`cfg.setDefaultEncoding(...
在ASP中,使用UTF-8编码可以确保网页能正确显示各种语言的文字,特别是对于非英文字符,如中文、日文、韩文等。 为了在ASP中使用UTF-8编码,你需要在页面顶部指定正确的MIME类型和字符集,例如: ```html ; ...
- 开发环境中,IDE(如Eclipse、IntelliJ IDEA)的项目编码设置也应设为UTF-8,防止源代码保存时出现问题。 10. **日志输出**: - 日志框架如Log4j、Logback的日志配置文件也要指定UTF-8编码,确保日志中的中文...
网站开发过程中,尤其是在进行国际化的过程中,常常会遇到UTF-8编码相关的乱码问题。这些问题主要集中在以下几个方面: 一、HTML页面转UTF-8编码问题 1. 首先,需要在HTML文档的部分,<title>标签之前添加标签来...
对于UTF-8编码的标题,可以使用`base64_encode()`函数编码标题文字,然后在`headers`中设置为`=?UTF-8?B?...?=`的形式。 3. **headers中的`Content-Type`设置**: 在邮件的headers中,`Content-Type`字段应当指定...
UTF-8编码因其广泛支持和兼容性成为了国际化的首选,但转换过程中的不彻底或者忽视某些细节往往会导致乱码问题。以下是针对网站开发中遇到的UTF-8乱码问题的详细分析和解决方案: 一、HTML页面转UTF-8编码问题: 1....
在ASP (Active Server Pages) 开发环境中,处理UTF-8编码的字符串时,通常需要特别注意,因为UTF-8是一种多字节字符编码,每个字符可能由1到4个字节组成。传统的字符串操作函数在处理UTF-8时可能会出现问题,比如...
每个网页都有一个编码标准,例如GBK或UTF-8,用于解释页面中的字符。为解决这个问题,可以在JSP页面的顶部添加`; charset=gb2312"%>`指令,明确指定页面的字符集。这样做可以确保浏览器以正确的编码解析页面内容,如...
4. **附件下载中的编码问题**:当使用PHP以附件形式发送文件时,如果文件名中含有中文字符,必须确保文件名使用GB2312编码,而不是UTF-8编码。可以通过PHP函数`iconv()`来进行编码转换。 #### 三、MYSQL 数据库使用...
在本案例"javascript经典特效---title显示日期.rar"中,我们聚焦的是如何利用JavaScript来实现在鼠标悬停时,标题(title)显示当前日期的功能。这种特效可以提升用户体验,使用户在无需离开页面或点击的情况下获取...
当需要截断较长的UTF-8编码的中文标题时,由于每个中文字符占用3个字节,简单的截取可能导致不完整的字符,造成乱码或问号。可使用以下函数进行智能截取: ```php function get_brief_str($str, $max_length) { if...