`
zww80216
  • 浏览: 47232 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

学艺要精,思考要慎.--转UTF-8编码的启发

阅读更多

本次对UUZone Refactor中一个大动作就是采用UTF-8编码,由于种种的历史原因,uuzone一直采用GBK编码,现在要把这个编码转成为UTF-8的。

本文不打算讨论技术, 所以简单地说明这个工作进展的一个过程:

* 最早的时候,n年前,我们一个项目需要国际化支持,毫无疑问utf-8是最佳的编码选择,这时候项目组就遇到了问题: 本地编写的文件中的中文都是GBK编码的, 仅仅设置页面的contentType="text/html; charset=UTF-8", 出来的全是乱码...当然拿GBK的东西直接要求对方用UTF-8看,一定是乱码. 

   当时如何解决的过程已经无法了解, 但最终采用的方案是:  用GBK写文件, 然后采用JDK中的native2ascii工具转换. 问题解决了, 但结果就是多了转码的过程, 转码后的jsp文件人不可读.

* 做uuzone了,  项目组建议采用GBK编码, 因为那个转码工作太繁琐了,而且导致文件不可读, 调试非常麻烦. 于是uuzone就成了GBK的.

   由于采用GBK, 遇到了很多相关的问题... 中途至少有2次我"建议"改用UTF-8, 都被评估认为有太多问题而没有被采纳(郁闷的boss啊...)...

* 发现原来不需要转码!  终于处于某些原因, 我需要自己动手来研究一些技术细节, 发现native2ascii转码的工作其实并不需要进行. jsp文件可以直接保存为UTF-8编码, 输出的结果就是UTF-8的...而现在的elips,editplus, ultraedit, 甚至notepad都能保存和识别utf-8的文件.

* 终于下定决心转为UTF-8. 既然如此, 就没有理由拒绝了. 因此本次refactor项目目标之一就是改用UTF-8.  既然文件打算用utf-8保存, 那么就需要批量转换工具...几下search, 好的工具也找到了.

* 转!   有工具, 不到20秒, 6000多个文件就从GBK转成了UTF-8文件格式...

* 问题来了! 项目中的XML, properties文件是否转码呢? 本来计划转...但很快发现,这些文件转掉后, XML,properties文件的读取都出了不同程度的问题...总之项目将根本无法运行... 原因何在?原来这些UTF-8的文件有一个所谓BOM头,也就是告诉你这个文件的编码是什么...不幸的是Java的xml parser, properties文件parser都不认识这个BOM头!已经有人把这个作为Bug提交给了SUN并被接受, 可是这个bug一直拖了4年,才在去年在Mustang项目(Java 6.0)中解决! 我们显然不能用了.

* 幸运的是... 我们可以规避这些问题, 我们并不需要把XML, properties文件转换成UTF-8的, 只要把jsp转了即可. 虽然一个项目中的文件两种保存格式,非常不优雅, 但毕竟这能解决问题啊... 转换完jsp文件,运行项目, 成功! 打开browser...页面也出来了!

* 几乎成功了! 是的, 几乎成功了...然而在计算机的世界里几乎成功就是不成功. 因为页面上的样式神秘地出了轻微的混乱. 经过n十分钟仔细研究讨论, 终于发现产生的html页面内出现了几个神秘的不可见字符... 就是这些可怕的不可见字符, 破坏了页面的结构.

* 神秘的隐身字符  和计算机打交道和比人打交道强的一个地方就是在于 -- 如果计算机错了,一定是你错了, 因为计算机一定忠实执行你的指令. 神秘的不可见字符一定有其来历. 经过二进制分析, 找到了这些神秘字符出现的地方 ---jsp include! 每次include就会出现神秘字符, 而这些神秘字符的值也是老朋友了 -- 就是BOM header ! 

* 难道不能include了?  原来java显然和xml文件一样对待了这些BOM头, 这些FF FE之类的东西成了输出的一部分. google 去查, 看到一个人显然遇到完全相同的问题, 可惜是个俄罗斯的程序员, 也看不懂其文章... :(

    怎么办?  有同学说: 既然你要UTF-8 (心想: 谁让你是boss呢? 愚蠢的boss啊...:-) ) , 我们还是用native2ascii吧...  不行! 

* 遇到困难要思考. 思考...

    首先, 为什么java文件不需要转码(java 文件中的中文无论如何都能正确)? 为什么jsp要? jsp不是被预编译成java的吗? 

    从那个sun承认的bug, 显然可以得出一个结论, java虚拟机中的file input stream没有能自动很具BOM识别文件编码. 

    也许javac是比较native的代码, 能通过操作系统获得native编码类型, 而java内部是unicode的, 所以输出也同样没问题.  而jsp是动态编译的, 预编译器是JVM...其待遇显然和xml等是一样的...

   难道sun公司的人会愚蠢到这种地步? 不可能, 一定是我们愚蠢.继续google 学习...

    不幸的是大部分google上关于这类编码问题的讨论都是不完整的. 但一个神秘的pageEncoding跳进了眼帘, 已经指定了contentType的encoding, 为什么还要指定pageEncoding?  查一下jsp的资料, 显然这正是问题所在!  pageEncoding就是告诉JVM 这个jsp本身采用的encoding, 默认采用iso-8859. 我们明明用GBK的native编码, 让JVM拿iso8859读取,当然不对了!!

* 根本没有需要转码, 问题解决了! 是的, 明白了原因所在, 把所有jsp文件头修改为: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK" %> 不需要任何转码,最终输出的就是UTF-8, 没有任何问题. 而且这些文件采用native格式保存, 编辑最方便!

分享到:
评论

相关推荐

    三年级语文下册 群鸟学艺 2教案 浙教版 教案.doc

    1. 故事内容:《群鸟学艺》是一篇童话故事,讲述了不同种类的鸟类向凤凰学习搭窝技巧的过程。通过故事,孩子们可以了解到学习的态度和方法对于掌握技能的重要性。 2. 教学要求: - 学生需要明白,只有认真、虚心和...

    三年级语文上册 群鸟学艺 3教案 人教版 教案.doc

    这篇文档是针对小学三年级语文课程“群鸟学艺”的教案,旨在通过有趣的故事教导孩子们一些重要的生活道理。教案的核心知识点如下: 1. **情感目标**:教学旨在让学生明白做事需有耐心,不怕困难,不怕疲劳,以此...

    二年级语文上册 梅兰芳学艺 2教案 苏教版 教案.doc

    7. 课堂互动:教学过程中设置了质疑环节,鼓励学生围绕课题提出问题,然后通过阅读寻找答案,这种提问式学习法能激发学生主动思考,提高他们的探究能力。 8. 课程安排:教案分为两课时,每课时都有明确的教学目的,...

    一年级语文下册 梅兰芳学艺1教案 鄂教版 教案.doc

    通过提出问题,如梅兰芳为什么要学习京剧,他是如何学习的,教师将引导学生去思考和发现梅兰芳学艺的决心和方法。梅兰芳在练习眼神时采用的独特方式,如观察飞翔的鸽子和游动的鱼儿,都是值得学生学习的例子。在这个...

    一年级语文下册 梅兰芳学艺 1教案 教科版 教案.doc

    综上所述,本课程的教学旨在激发学生对语文学习的兴趣,通过《梅兰芳学艺》这一富有启发性的课文,让学生们在学习语文知识的同时,领悟到努力与坚持的重要性。通过本课的学习,学生们不仅能够提升自己的语文技能,还...

    三年级语文上册 群鸟学艺 2教案 人教版 教案.doc

    这篇文档是针对小学三年级语文上册的一篇名为《群鸟学艺》的课文的教学教案,旨在帮助学生理解和学习故事中的核心知识与道德教育。以下是教案的主要内容和涉及的知识点: 1. **教学目标设定**: - **知识目标**:...

    《群鸟学艺》读后感500字.doc

    《群鸟学艺》这一童话故事,虽简洁明了,却蕴含着深刻的道理,给我们的生活和学习带来了诸多启示。故事中不同性格的鸟类,在学习搭窝的过程中表现各异,尤其小燕子的虚心好学和坚持不懈成为了一个鲜明的对比。凤凰...

    二年级语文上册 梅兰芳学艺 3教案 苏教版 教案.doc

    【梅兰芳学艺】是苏教版二年级语文上册的一篇课文,讲述了著名京剧大师梅兰芳小时候学习京剧,克服自身不足,通过勤学苦练最终成功的故事。这篇课文旨在让学生理解并掌握基本的语文技能,同时教育学生勤奋努力可以...

    一年级语文下册 蜗牛学艺2教案 沪教版 教案.doc

    沪教版小学一年级语文下册《蜗牛学艺2》教案以生动有趣的故事作为教学载体,不仅注重基础的汉字学习,更深入到阅读理解和语言表达能力的培养。通过这篇教案,学生们将学习到一系列汉字,了解故事蕴含的哲理,并激发...

    二年级语文上册 14梅兰芳学艺教案 苏教版 教案.doc

    1. 课程内容:本教学材料是针对二年级语文上册的第14课《梅兰芳学艺》的教案,属于苏教版教材。课文讲述了著名京剧大师梅兰芳小时候如何通过勤学苦练提升自己的表演技艺,尤其是眼神的训练。 2. 教学目标: - 语言...

    鲁班学艺的读后感精选.doc

    《鲁班学艺》的故事在中国传统文化中具有深远的影响,它讲述了古代木匠鼻祖鲁班如何通过艰苦努力和坚韧不拔的精神,最终成为一代工艺大师的过程。从故事中,我们可以提炼出几个重要的知识点,对于个人成长和学习有着...

    二年级语文上册《梅兰芳学艺》教学设计 苏教版.doc

    小学教案

    鲁班学艺的读后感参考.doc

    鲁班学艺的读后感参考.doc

    一年级语文下册《蜗牛学艺》教案 沪教版.doc

    一年级语文下册《蜗牛学艺》教案 沪教版.doc

    1_张学艺748.GBQ6.gbq6

    1_张学艺748.GBQ6.gbq6

    《学艺APP》商业计划书.zip

    《学艺APP》商业计划书是一份针对初创企业或大学生创业者设计的项目报告,它涵盖了创建一款名为“学艺”的应用程序的所有关键要素。这个APP旨在为用户提供艺术与技能学习的平台,通过创新的方式促进个人发展和知识...

    藏族民间故事加措学艺-4页.pdf

    《加措学艺》是藏族民间流传的一个富有哲理的故事。故事主要讲述了三兄弟各自出门求师学艺,大哥成为裁缝,二哥成为木匠,都赚到了钱,而小弟加措则用他的银子帮助了一个贫穷的热巴家庭,并从他们那里得到了一把胡琴...

    苏教版小学语文二年级上册精品课件梅兰芳学艺PPT课件.pptx

    通过这种形式,不仅增加了课堂的趣味性,更重要的是,激发了孩子们主动思考和表达的能力。每个孩子的心里或许都会种下一颗梦想的种子,而从梅兰芳的故事中,他们学会了怎样去灌溉和培养这颗种子。 《梅兰芳学艺》...

    2018《学艺APP》 商业计划书.pdf

    《学艺APP》商业计划书概述了以分享经济为基础,结合互联网技术,旨在解决传统技艺学习中的信息不对称和资源不匹配问题。该APP致力于搭建一个连接行业专家、求学者和企业顾问的平台,覆盖基础教育、技能学习、经验...

    三年级语文 群鸟学艺教案 人教版 教案.doc

    《群鸟学艺》是一篇适合三年级学生的语文教学教案,主要目标是帮助学生通过阅读课文,提高他们的语言理解和表达能力,同时传授一个重要的生活道理。该教案以人教版教材为基础,采用生动的教学方法,引导学生深入理解...

Global site tag (gtag.js) - Google Analytics