|
|
January 08 最近比较烦,比较烦,比较烦....CUCOS的网站我是重写了代码了,IE下一切正常,FF下就变得很奇怪,连编码都不对,我明明指定了:
<META http-equiv="content-type" content="text/html; charset=utf8">
IE自动就是utf-8,FF自动是ISOxxxx,乱码一堆....囧啊
去了W3C Validator上测试,W3C也不认我的UTF-8,说HTTP header 编码为ISOxxxx,和页面编码UTF-8不符....你奶奶的,我研究了半天,无果
后来我想,说http header的问题,是不是会是Apache的问题呢? 因为我在本地Apache上测试没问题啊,服务器的Apache应该默认编码ISOxxxx的...
于是我开始Baidu:
Apache的编码问题分析
2007年11月22日 星期四 15:54
谈到Apache的编码我们就要涉及到3个东西
- http标记语言中的<META http-equiv="content-type" content="text/html; charset=xxx">标签
- PHP中的header("content-type:text/html; charset=xxx");函数
- Apache配置文件httpd.conf中的AddDefaultCharset
一、<META http-equiv="content-type" content="text/html; charset=xxx">标签
按顺序来,先说这个<META>标签,这个标签有很多功能的,具体请点这里。
我今天想说只是上面提到的那种形式。解释一下<META http-equiv="content-type" content="text/html; charset=xxx">,意思是对这个网页进行声明,让浏览器对整个页面的内容采用xxx编码,xxx可以为GB2312,GBK,UTF-8(和MySQL不同,MySQL是 UTF8)等等。因此,大部分页面可以采用这种方式来告诉浏览器显示这个页面的时候采用什么编码,这样才不会造成编码错误而产生乱码。但是有的时候我们会发现有了这句还是不行,不管xxx是哪一种,浏览器采用的始终都是一种编码,这个情况我后面会谈到。
请注意,<meta>是属于html信息的,仅仅是一个声明,它起作用表明服务器已经把HTML信息传到了浏览器。
二、header("content-type:text/html; charset=xxx");
这个函数header()的作用是把括号里面的信息发到http标头。关于此函数具体用法请点击这里。
如果括号里面的内容为文中所说那样,那作用和<META>标签基本相同,大家对照第一个看发现字符都差不多的。但是不同的是如果有这段函数,浏览器就会永远采用你所要求的xxx编码,绝对不会不听话,因此这个函数是很有用的。为什么会这样呢?那就得说说HTTPS标头和HTML信息的差别了:
https标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串。
因为meta标签是属于html信息的,所以header()发送的内容先到达浏览器,通俗点就是header()的优先级高于meta(不知道可不可以这样讲)。加入一个php页面既有header("content-type:text/html; charset=xxx"),又有<META http-equiv="content-type" content="text/html; charset=xxx">,浏览器就只认前者http标头而不认meta了。当然这个函数只能在php页面内使用。
同样也留有一个问题,为什么前者就绝对起作用,而后者有时候就不行呢?这就是接下来要谈的Apache的原因了。
三、AddDefaultCharset
Apache根目录的conf文件夹里,有整个Apache的配置文档httpd.conf。具体如何配置apache请点击这里(windows,linux)。
用文本编辑器打开httpd.conf,第708行(不同版本可能不同)有AddDefaultCharset xxx,xxx为编码名称。这行代码的意思:设置整个服务器内的网页文件https标头里的字符集为你默认的xxx字符集。有这行,就相当于给每个文件都加了一行header("content-type:text/html; charset=xxx")。这下就明白为什么明明meta设置了是utf-8,可浏览器始终采用gb2312的原因。
如果网页里有header("content-type:text/html; charset=xxx"),就把默认的字符集改为你设置的字符集,所以这个函数永远有用。如果把AddDefaultCharset xxx前面加个“#”,注释掉这句,而且页面里不含header("content-type…"),那这个时候就轮到meta标签起作用了。
总结:
来个排序
- header("content-type:text/html; charset=xxx")
- AddDefaultCharset xxx
- <META http-equiv="content-type" content="text/html; charset=xxx">
如果你是web程序员,给你的每个页面都加个header("content-type:text/html; charset=xxx"),保证它在任何服务器都能正确显示,可移植性强。
至于那句AddDefaultCharset xxx,要不要注释就仁者见仁了。反正我是注释掉了,不过我写页子也要写header(),便于放到服务器上能正常显示。
mysql数据库操作乱码问题
在mysql语句里写入
mysql_query("SET NAMES 'gb2312'");
即可指定查询的时候传送的字符编码是gb2312
Yooshi,原来可以用PHP的header()来override Apache的编码,吼吼
于是我加上了这句在网页开头:
<?php header("content-type:text/html; charset=utf-8"); ?>
一测试?一个大warning出来了....说header已经被send,不能override....怎么会是?
我的php header()明明在第一行啊!?
fireup我的浏览器,去php.net查header()
没什么太大的东西..怎么办呢...!...还好我读的认真,连评论都看了,嘎嘎,现在发现解决办法了!
henfiber at gmail dot com 04-Dec-2007 09:19
Is there a serious problem with utf8 encoding? Answer: no- utf8 with bom is a problem..
I spent about 10 hours trying every tip or fix suggested by users to fix the problem with " headers already sent ".
Finally I found the problem with a hex editor.
As it is previously mentioned header() should be the first statement. Moreover php opening and closing tags should be clean of spaces:
So something like this should work:
<?php header('something ..'); ?>
I had applied an authentication scheme to my pages using sessions. The encoding of my files was "utf-8". Though I tried cleaning everything about spaces,tabs and other dirt through my code, I kept getting these " headers already sent errors..". The problem was in utf-8 encoding ( I don't mean the meta:http-equiv=" charset='utf-8' tag but the actual encoding of my file.) When I changed to ANSI everything worked. Actually the utf-8 encoding added three characters at the start of my file : ο»Ώ. This is called bom in utf-8. So if you are going to use utf-8 encodings to your pages and need to put php header code in these pages choose to save "utf8 without bom". (I hope your editor has such an option - I use notepad++ in win32 ) Hope it helps..
|
明白了吧! 什么,不明白?好吧,我简单地讲一下:
utf-8 编码有with BOM和without BOM两种....BOM是Byte Order Mark的意思,它会在前面加上3个字节(我也不知道具体多少...)来区分endianess..具体的去点我链接看WIKI吧...
Windows下面这个多出的东西没问题,所以我在本地测试OK...当我传到Linux服务器上,这3个字节就暴露了...成为了猥琐的乱码并干扰了网页的输出.....狠吧...
解决办法是,我用的Notepad++,改编码为ANSI,保存,上传,一切OK,顺利通过W3C Validator
吼吼,折腾了一小时,咻~~
希望这篇文章能给大家有所帮助,谢谢!
附 一篇
apache+php 字符编码问题解决
问题:
如果你在网上搜索 “apache配置”,搜到的页面大多都会建议你在httpd.conf中加上这么一句:AddDefaultCharset GB2312。对于新手而且是只用GB2312编码的开发人来说,这么做是ok的。
但是如果要想使用UTF-8字符集的话,比如 在test.php文件中需要有 meta http-equiv="Content-Type" content="text/html; charset=UTF-8" 这段代码。这时你再打开浏览器访问test.php页面的话,你看到的是正确的页面。但是如果实际上浏览器还是以GB2312编码解释从服务器返回的response,为什么呢?原因是浏览器是根据http应答消息头部中的 Content-type: text/html; charset=GB2312 来决定使用何种编码解释应答,也就是说apache服务器仍然用GB2312编码传递数据。
所以说如果apache的默认字符集被设置成了GB2312,即使在页面中声明使用UTF-8编码,apache服务器还是会按照GB2312编码来传送http response。
没关系,我们把AddDefaultCharset GB2312 改成 AddDefaultCharset UTF-8,看看什么结果?如果你看到乱码恭喜你,你还知道是乱码问题;如果你看到是空白页面,那么你就惨了,你可能会以为这是其他什么原因造成的,而不会从编码的角度去考虑怎么解决问题。这是为什么?
原因在于php文件本身是用系统字符集来编码的,中文的windows XP都是用GB2312,每一个文件头部都有字段指示该文件是用何种方式编码的。当apache接到浏览器的请求后,会让php去解释所请求的页面,比如 test.php。php会识别出test.php的编码方式是GB2312后(就像我们用javac编译java源文件时,编译器默认用系统编码读源文件里的内容。如果源文件不是用系统编码来保存的,可以用命令javac -encoding指定具体的编码),把数据以GB2312的编码格式传递给apache,而apache服务器不会改变从php传来的数据,只是在应答消息头部中把字符集设置成UTF-8: Content-type: text/html; charset=UTF-8. 也就是说你传递的是GB2312编码的数据,而浏览器却以UTF-8编码来解释应答消息。
由于UTF-8为3个字节表示一个汉子,而普通的GB2312或BIG5是两个。页面输出时,由于上述原因,出现半个汉字的情况,这时该半个汉字会和的>结合成一个乱码字,导致IE无法读完的话,会发现实际上整个叶面全部已经输出了。如果使用的是Mozilla、Mozilla Firefox、Sarafi的浏览器这不会造成这个问题,而是一堆乱码。这是由于Firefox浏览器和IE解析网页编码的策略不同产生的。
OK,我们把test.php以UTF-8保存,再用浏览器访问时,就没有问题了。可这样做,会使得apache目录下的所有web应用只能用同一种编码。如何搞定?
解决办法:
首先,可以使用AddDefaultCharset off来关闭默认文件编码,这样apache服务器就不会在http应答消息头部设置charset,只是设置Content-type: text/html. 而浏览器就会依靠html文件中设置的harset来决定编码。其次,脚本php.ini文件中的default_charset = “UTF-8″作用同httpd.conf文件,把该行注释掉,使php自动识别文件的编码方式。
这样不论你用什么编码方式,只要test.php中的 meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ 与你test.php文件编码方式相同,就不会产生乱码问题。
用户提交数据的编码
浏览器提交的字符编码由客户端的characher encoding决定。例如,当前浏览器的编码是Gb2312,用户提交数据后,无论apache设置的编码方式是GB2312还是UTF-8,这时在服务器端接收到的仍是以Gb2312编码的数据。如果要在返回页面上显示用户刚才提交的数据,而该页面是用UTF-8编码的,或者要在数据库中存储的用户提交的数据,而数据库是UTF-8编码的,那就要做字符转换了。 | January 06 学车时,大家都经历了数个月严寒酷暑中“揉库”等非人的摧残,直到最后路考的时候,大家都是摩拳擦掌,紧张异常,面对穿着官衣儿和戴着大檐帽的交警考官就更象老鼠见猫了,所以常常都会因为紧张过度而错上加错,笑话百出。 1.路考前, 一个考生照例在上车前站在驾驶座前报告,例如:“报告考官,学员王富贵请求上车。”考官应回答:“准许上车。”结果一个不幸的女生说成:“报告考官,学员xxx请求上床。”小货大货考车大多是整组学员和教练同行。当时众生皆笑成一团。 更要命的是考官一听乐了,回道:“准许上床。你看哪合适?” 2.又一考生顺利上车后,坐在驾驶座上打火,踩油门检查完仪表后对考官说:“报告考官,各仪表检查正常,请求起飞。” (应为请求起步,估计该考生自小就有当飞行员的理想) 考官听后沉稳的回答:“准许起飞,注意前方高压电。” 3.考试途中,考官会提出一些要求让考生去做,比如前方路口左转弯,压井盖,单边双边什么的。 考生应该回答:“明白。”以确定明白了考官的问题。北京某驾校有个特殊的环岛叫做王八岛。 结果,一个考官说:“前方王八岛左转。”考生回答成:“王八明白。” 4.终于快结束考试了,考官说:“前方停车。”结果不料前面一个消火栓。学员很惊恐回道:“报告消火栓,前方不能停车。” 5.我记得我学车第一次(应该是进场开,但是那天太晚,居然直接在路上开),一个师兄大转弯,结果开到相对车道上,迎面开来一辆大巴,大巴司机马上刹车。师傅也一个急拉手刹,然后劈头就骂:你以为是在香港开车啊!!!!坐后面的几个师兄笑的快晕了。 6.关于起步的还有一个|"一哥们由于紧张说成了:仪表一切正常|"请求起床。考官一听就乐了:还没睡醒呢吧?准许起床! 7.路考,考官说:前方环岛左转:学员说:明白,前方环岛左转, 等转过去后,考官说,下车,不合格,学员不解,您能让我死个明白么? 考官晕晕地说:你数数你转了几圈才转过来的~~ 8.还有一个老兄,考完试考官把他的ic卡收走了(其实这就说明是合格了) 老兄坚持不下车,对考官说:“你还没还我ic卡呢” 考官开始没理他,谁知他坚持没完没了的要。 终于把考官惹怒了,说:“你要啊,那还你”,于是他挂了。 9.听我舅讲过他考车时候(7年前)的笑话:那时候大家都极力地讨好考官,什么bt招数都用。 有一位上了车,先不打火,对着身边考官一劲傻笑。 考官给笑毛了,问他傻笑什么。 他说:我觉得您怎么看怎么像我三大爷……考官昏死。 10.又有一位,上了车先跟考官搭话:“您往我旁边一坐我就特紧张,都不会开了。” 考官白他一眼:“甭紧张,好好开你的。” 然后这个人就开始自言自语:“其实我也知道不用紧张,就是管不住我自己。刚才我就问刚下来的学员,有什么办法不紧张。他们告诉我说:上了车什么也别多想,就当是现在车里只有自己一个人,或者就当旁边坐的是一条狗……” 考官再次昏死~~~后来传说他们那一组只有他考过了。 11.学员考前紧张啊,第一次就折了。 等补考的时候起步拼命的挂档,还奇怪呢,档怎么挂不上啊!最后使劲儿,档把儿折了。 肯定又没过呗。下车问他师傅,他师傅骂他,不踩离合挂的上档吗! 12.一留学生在美国考, 前方路标提示左转,不是很确定, 问曰:“turn left?” 答曰:“right” 于是……右转~~ 挂了 13.我同学,mm,路考的时候很紧张,心里一直默念“系安全带系安全带!!!”然后就把安全带插到副驾驶的那个孔里面了~考官问她“你不觉得勒的慌嘛!” 14.我当时学车的时候,用的很旧的皮卡,我们那一组有个是我们学校的厨师,力气大,有一次坡道停车的时候,教练说:你使劲拉手刹,你使劲拉,你使劲。。。。结果厨师一使劲,把手刹拉出来了。 15.我同事前些日子学上路,教练叫她踩油门,她脚在下面捞了半天没踩到,脱口而出:“油在哪?油在哪?”把教练乐得:“在超市呢,还有菜油、花生油,要那种?” 16.偶们昆明路考有一项:定点停车(考官指定一明显标志物,如树,警告牌等)一师姐考试中,考官说:前方那棵半截树看到没有,定点停车! 师姐答:看到!结果停过头了。师姐随机应变:报告考官,没有看清树,能下一棵吗?考官同意。结果下一棵又停过头。师姐再次报告:能下一棵吗?考官同意。结果再次停过头。考官无奈,让师姐自己找棵树停。结果师姐停到了两棵树中间。。。考官晕死。 17.还有一个,我同学说他学车时,看见旁边一练习车开的巨慢,里面的老兄使劲踩油门也不管用,带着一大股糊味儿在练车场里转来转去,都快冒烟了。后来才知是那位老兄一直没松手刹...... 18.师傅说过一次某人路考:“报告!” “上来....” “后视镜良好 各仪表工作正常 请求起飞.....” “那你要飞就飞吧....|"考官答曰.... 于是上路开了快半个钟头。学员纳闷,别人都只一会,我怎么还不掉头?啊?...终于憋不住了..问之.. 考官大大..我们是不是该掉头了??”考官答曰:“莫急...这里才黄埔路..继续往前开..不到天河机场你怎样降落咧??” 19、某漂亮MM路考中换档时一时紧张,抓档的手错伸到考官的裤档中, 结果~~ 考官说道:OK,通过! 20. 一次途中在路边小店打了个尖,出来师傅让师兄看看还有多少油。师兄拧开油箱盖往里看,什么也看不见,哥们拿出个火机点着想照照看,幸亏师傅眼疾手快,飞起一腿,把师兄踢倒在地,要不估计现在也没有这个故事了,全玩完了。
嘎,乐爆了.....我因为对"请求起飞"这个故事印象很深,差点就在考试的时候起飞了...
January 03 经常有人问我C和C++那个好,应该学什么,其实吧咱也说不清,还是学C++吧吼吼,当然C是基础...囧rz
放出几篇文章分享
C++ FAQ
C语言与C++的区别有很多: 1,全新的程序程序思维,C语言是面向过程的,而C++是面向对象的。 2,C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;而C++对于大多数的函数都是有集成的很紧密,特别是C语言中没有的C++中的API是对Window系统的大多数API有机的组合,是一个集体。但你也可能单独调用API。 3,特别是C++中的图形处理,它和语言的图形有很大的区别。C语言中的图形处理函数基本上是不能用在中C++中的。C语言标准中不包括图形处理。 4,C和C++中都有结构的概念,但是在C语言中结构只有成员变量,而没成员方法,而在C++中结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,什么想访问它的都可以访问;而在VC++中它没有加限定符的为私有的。 4,C语言可以写很多方面的程序,但是C++可以写得更多更好,C++可以写基于DOSr程序,写DLL,写控件,写系统。 5,C语言对程序的文件的组织是松散的,几乎是全要程序处理;而c++对文件的组织是以工程,各文件分类明确。 6,C++中的IDE很智能,和VB一样,有的功能可能比VB还强。 7,C++对可以自动生成你想要的程序结构使你可以省了很多时间。有很多可用的工具如加入MFC中的类的时候,加入变量的时候等等。 8,C++中的附加工具也有很多,可以进行系统的分析,可以查看API;可以查看控件。 9,调试功能强大,并且方法多样。
鉴于当下形势,如果要学的话就学C#,具体可以参考我的帖子。
http://zhidao.baidu.com/question/225734.html
附一篇Java和C++的:
Pascal、C和 C++这些广为编程人员熟悉的编程语言,为编程人员在实际开发工作中提 供了理想的功能,和这些语言的功能相比,Java似乎更胜一筹。Java的结构无关性、真正的面 向对象和与Internet的协同工作等特性比上述任何一种语言更显得完善。Java的许多术语来 自于C++,其语法也来自于C++。Java比C/C++易学、易用,且有强大的内建功能。当Java在编 程领域得到广泛应用后,C++将可能退出历史舞台,因为Java能做C++的所有事情,同时,Java的 代码可以重用。Java的主要缺点是解释执行,所以,C++的性能仍是较为突出的。然而,由于C ++即时编译器(Just-intime Compiler)的开发,这一性能的沟壑也随之填平了。下面我们讨 论Java和C/C++的详细区别。
指针 指针包含变量的地址,指针在 C++编程过程中可能引起许多错误,容易造成内存崩溃。C ++程序员构造动态数据时使用的复杂的指针算法造成许多复杂的错误,致使浪费了大量的时 间。考虑到这种原因,Java的创造者取消了指针。指针的功能由参考(reference)所取代,通 过参考,Java可以遍历所有的对象和数组。Java并没有因为缺乏指针而使得复杂数据结构的 实现变得困难,实际上,在Java中这种复杂数据结构的实现更加容易,因为用对象和对象数组 实现复杂的数据结构更为可靠。
函数 Java没有函数,但是Java的类和方法能够实现C/C++用函数实现的任何任务。C语言编程 人员希望在标准库中找到的函数,Java用各种类的静态方法来实现。例如,三角函数是作为M ath类的静态方法来实现的,作为一种静态方法,用户不一定必须创建一个Math对象使用它们 。
多重继承 虽然多重继承是C或C++语言从多个父类中派生一个类的有效方法,但是由于这种派生很 复杂,因而也很容易产生问题。正是由于这种原因,Java的开发者没有采用多重继承,Java的 类似Objective C协议的接口能够完成C++中多重继承能够完成的所有任务。
Goto语句 在Java中为了简单也没有采用C++语言中的goto语句,因此Java可以不关心与goto语句 有关的规则。Java中的多重break和continue能够实现C++语言中goto语句的功能。
联合和结构 在C++语言中有三种复杂的数据类型:联合、结构和类;而在Java中只采用了类,其中在C ++中用联合和结构实现的工作,Java都用类来实现。
字符串 Java将字符串作为一级对象、String和StringBuffer,这与缺乏对文本字符串内建支持 的C和C++是不同的。为了实现这种字符串,C或 C++的程序员通常采用字符串数组。Java的字 符串更具有一致性和可预测性,因为在Java中它们可以实现运行时检测,更容易避免错误。
操作符重载 在Java中,程序员不再重载标准的算术操作符,操作符重载在C++语言中是一个重要的特 性,而在Java中通过类实现了创建并行功能(parallel funtionality)。
Typedef、define或预处理器 Java源代码很简单,它不需要#define语句、预处理器或者typedef。Java语言去掉了ty pedef和define,但需要头文件。此外,Java语言派生了来自于源文件的其他类及其方法的定 义。与C和C++不同,有关Java一个类的信息必须包含在一个文件中,而C和 C++的有关类的信 息可能分散在一个头文件及多个代码文件中。
数据类型自动强制转换 Java语言不允许数据类型的自动强制转换。在C++中编程人员可以给一个变量赋值,但赋 给该变量的值可能由于变量应用环境的不同而导致丢失。在Java中强制一种类型的数据元素 成为一种不太精确的数据类型需要编程人员采用预测方法。
命令行变量 Java运行时系统允许命令行变量的传递。这种语法和C语言的语法有些类似,但程序名并 不在变量列表中,因为它的名字和它的类一样。
靠,中文的术语太变态了...看不懂唉...
|