PHP网站开发遇到的中文编码

  • 来源: 未知 作者: 老苏   2011-07-18/10:08
  • ..header("content-type:text/html;charset=xxx")

    PHP法式设计中中文编码题目曾困扰良多人,致使那个题目的缘由真正在很简单,每一个国度(或地区)都划定了计较机信息互换用的字符编码集,如好国的扩大ASCII码,中国的GB2312-80,日本的JIS等。作为该国度/地区内信息处置的根底,字符编码集起着同一编码的主要感化。字符编码集按长度分为SBCS(单字节字符集),DBCS(双字节字符集)两年夜类。初期的硬件(特别是操作系统),为领会决当地字符信息的计较机处置,呈现了种种当地化版本(L10N),为了辨别,引进了LANG,Codepage等概念。然则果为各个当地字符集代码规模堆叠,彼此间信息互换坚苦;硬件各个当地化版本自力保护本钱较高。是以有需要将当地化事情中的共性抽掏出来,作分歧处置,将迥殊确当地化处置内容下降到起码。那也就是所谓的国际化(118N)。种种说话信息被进一步范例为Locale信息。处置的底层字符集酿成了险些包罗了所有字形的Unicode。

    办理种种利用的治码题目

    WebjxCom提醒:PHP法式设计中中文编码题目曾困扰良多人,致使那个题目的缘由真正在很简单,每一个国度(或地区)都划定了计较机信息互换用的字符编码集,如好国的扩大ASCII码,中国的GB2312-80,日本的JIS等。

    定位中文编码题目凡是是采取最笨的也是最有用的法子―正在你以为有嫌疑的法式处置后挨印字符串的内码。经过挨印字符串的内码,你可以收现甚么时间中笔墨符被转换成Unicode,甚么时间Unicode被转回中文内码,甚么时间一其中笔墨成了两个Unicode字符,甚么时间中笔墨符串被转成了一串问号,甚么时间中笔墨符串的高位被截得降了…&hellipPHP网站开发遇到的中文编码;

    数据库中的字符集编码题目

    4)php.ini中的default_charset设置装备摆设:

    风行的闭系数据库系统都撑持数据库字符集编码,也就是说正在建立数据库时可以指定它本人的字符集设置,数据库的数据以指定的编码情势存储。当利用法式拜候数据时,正在进心和出心处都市有字符集编码的转换。对中文数据,数据库字符编码的设置该当包管数据的完备性。GB2312、GBK、UTF-8等都是可选的数据库字符集编码;固然我们也能够选择ISO8859-1(8-bit),只是我们得正在应

    http标头是办事器以http和谈传送HTML信息到阅读器前所送出的字串。而标签是属于HTML信息的,所以header()收送的内容先达到阅读器,浅显点就是header()的优先级高于(不知道可弗成以如许讲)。假设一个php页里既有header("content-type:text/html;charset=xxx"),又有,阅读器就只认前者http标头而不认meta了。固然那个函数只能正在php页里内利用。

    下里列出以上的优先挨次:

    SETNAMES隐现客户端收送的SQL语句中利用甚么字符集。是以,SETNAMESutf-8语句报告办事器“未来从那个客户端传来的信息采取字符集utf-8”。它还为办事器收送回客户真个后果指定了字符集(例如,若是你利用一个SELECT语句,它透露表现列值利用了甚么字符集)。

    完毕语

    用文本编纂器挨开httpd.conf,第708行(差别版本大概差别)有AddDefaultCharsetxxx,xxx为编码名称。那行代码的意义:设置全部办事器内的网页文件http标头里的字符集为你默许的xxx字符集。有那行,就相当于给每一个文件都加了一行header("content-type:text/html;charset=xxx")。那下就大白为何明明设置了是utf-8,可阅读器初末采取gb2312的缘由。

    1)利用标签设置页里编码

    那个函数header()的感化是把括号里里的信息收到http标头。若是括号里里的内容为文中所说那样,那感化和标签根本沟通,年夜家对比第一个看收现字符都差不多的。然则差别的是若是有那段函数,阅读器就会永久采取你所要求的xxx编码,尽对不会不听话,是以那个函数是很有效的。为何会如许呢?那就得说说http标头和HTML信息的不同了:

    php.ini中的default_charset="gb2312"界说了php的默许说话字符集。普通保举正文得降此行,让阅读器按照网页头中的charset来主动选择说话而非做一个强造性的划定,如许便可以正在同台办事器上供给多种说话的网页办事。

    若是网页里有header("content-type:text/html;charset=xxx"),就把默许的字符集改成你设置的字符集,所以那个函数永久有效。若是把AddDefaultCharsetxxx前里加个"#",正文得降那句,并且页里里不露header("content-type…"),那那个时间就轮到meta标签起感化了。

    ..

    Apache根目次的conf文件夹里,有全部Apache的设置装备摆设文档httpd.conf。

    ..AddDefaultCharsetxxx

    若是你是web法式员,建议给你的每一个页里都加个header("content-type:text/html;charset=xxx"),如许便可以包管它正在任何办事器都能准确隐现,可移植性也比力强。

    定位题目时经常使用的技巧

    现正在年夜部门具有国际化特点的硬件焦点字符处置都是以Unicode为根底的,正在硬件运转时按照其时的ocale/Lang/Codepage设置肯定响应确当地字符编码设置,并依此处应当地字符。正在处置进程中需要真现Unicode和当地字符集的彼此转换,甚或以Unicode为中心的两个差别当地字符集的彼此转换。那类体例正在收集情况下被进一步延长,任何收集两头的字符信息也需要按照字符集的设置转换成可启受的内容。

    真正在php开辟中的中文编码并出有想像的那末复纯,固然定位和办理题目出有定例,种种运转情况也各不尽然,但后里的道理是一样的。领会字符集的常识是办理字符题目的根底。不中,跟着中笔墨符集的变革,不但仅是php编程,中文信息处置中的题目仍是会存正在一段工夫的。

    3)AddDefaultCharset

    一样也留有一个题目,为何前者就尽对起感化,我后者有时间就不可呢?那就是接下来要谈的Apache的缘由了。

    请注重,是属于HTML信息的,仅仅是一个声明,仅解释办事器已把HTML信息传到了阅读器。

    用法式写数据之前先将16Bit的一个汉字或Unicode拆分红两个8-bit的字符,读数据以后也需要将两个字节开并起来,同时还要辨别此中的SBCS字符,是以我们其真不保举采取ISO8859-1作为数据库字符集编码。如许不单出有充真使用数据库本身的字符集编码撑持,并且同时也增添了编程的复纯度。编程时,可以先用数据库办理系统供给的办理功效查抄此中的中文数据是不是准确。

    2)header("content-type:text/html;charset=xxx");

    那个标签的感化是声明客户真个阅读器用甚么字符集编码隐现该页里,xxx可觉得GB2312、GBK、UTF-8(和MySQL差别,MySQL是UTF8)等等。是以,年夜部门页里可以采取那类体例来报告阅读器隐现那个页里的时间采取甚么编码,如许才不会造成编码毛病而收生治码。然则有的时间我们会收现有了那句仍是不可,不管xxx是哪一种,阅读器采取的初末都是一种编码,那个环境我后里漫谈到。

    取用开适的样本字符串也有助于辨别题目的类型。如:"aa啊aa?@aa"等中英相间,GB、GBK特点字符均有的字符串。普通来讲,英笔墨符不管怎样转换或处置,都不会得真(若是碰到了,可以测验考试着增添延续的英笔墨母长度)。

    PHP法式正在查询数据库之前,起尾履行mysql_query("SETNAMESxxxx");此中xxxx是你网页的编码(charset=xxxx),若是网页中charset=utf8,则xxxx=utf8,若是网页中charset=gb2312,则xxxx=gb2312,险些所有WEB法式,都有一段毗连数据库的大众代码,放正在一个文件里,正在那文件里,参加mysql_query("SETNAMESxxxx")便可以了。


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多