• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            轉碼UTF-8時遇到的PHP&MySQL的字符集問題

            這幾天想給網站加一個WAP版,根據wml協議的規定,必須符合XML標準,采用utf8編碼字符。這事說起來簡單但做起來難,昨天折騰了大半天的,首先倒騰一些庫的PHPtemplate文件,把ANSI轉成UTF-8,同時還要去掉UTF-8規定的開頭三字節長度標識符,否則PHP無法識別;然后研究和調整數據庫編碼,找了很多資料鉆研MySQL編碼的細節,排列組合式的測試,最后發現被誤導了,根本不用研究那么多,用最簡單的方式就可以了。無論如何,最后總算是大功告成了。在網上查資料的時候,發現很多都語焉不詳,這里把心得總結一下。

            網站采用PHP腳本語言,是基于Discuz搭建的,基本編碼是前臺和數據處理采用GBKANSI),數據庫采用MySQL默認的latin1。我發現Discuz存儲和處理數據庫編碼的方式相比文章《MySQL的字符集問題》所描述的情形來說比較簡單粗暴,僅僅SET NAMES 'latin1',然后不分青紅皂白把字符串往里扔,而不管什么character_set_clientcharacter_set_connectioncharacter_set_results還是collation_connection。雖說簡單粗暴,但是這其實是MySQL推薦實現的方式,即數據庫具體的數據字符集保持和SET NAMES的參數一致,這樣進行讀寫是兼容性最好的。盡量不要采用對這

            三個參數分別設置不同值的方式,那樣會帶來潛在的bug和混亂。

            由于SET NAMES ‘x’ 等效于:
            SET character_set_client = x;
            SET character_set_results = x;
            SET character_set_connection = x;
            SET character_set_connection = x; 執行的同時也自動指定了collation_connectionx的默認字符集collation(如xutf8collation_connectionutf8_general_ci),因此SET NAMES必須和數據列中指定的字符集一致,否則會報錯。

            SET CHARACTER SET則不同,但它將連接的collation_connectioncollation_connection分別設置為默認數據列的字符集和collation

            SET CHARACTER SET x 等效于:
            SET character_set_client = x;
            SET character_set_results = x;
            SET collation_connection = @@collation_database;
            SET collation_connection
            同時也會自動設置character_set_connection為同樣的值,這樣SET CHARACTER SET就無論如何設置,在進行數據庫存取操作的時候都不會報錯。但是邏輯上就需要程序員自己來保證。

            數據庫管理程序并不負責給你的字符串進行編碼,你的SET只是告訴數據庫:哥們,你就按我說的編碼那么處理吧,出了事我負責。

            由于Discuz這種簡單粗暴而又由于其兼容性而值得推薦的對字符集的處理方式,所以對于之前的網站系統,前臺數據編碼處理流程:
            網站直接將GBK扔給數據庫   |SET character_set_client = 'lain1'    |SET character_set_connection = 'lain1'
            存儲及訪問:GBK--------------->數據庫認為其為latin1進行接收---------------->latin1編碼存儲

            SET character_set_connection = 'lain1' |SET character_set_results = 'lain1' |網站直接把latin1GBK輸出
            讀取:數據庫讀取編碼為latin1的數據---------------->以編碼為latin1輸出------------------>GBK

            所以,在寫WAP頁面或者有要把網站轉成UTF-8編碼的需求的時候,其實很簡單,只要在腳本程序里,把字符串編碼轉換一下就可以了。比如這里我們用PHP,那么用iconv或者mbstring都可以:

            $str = iconv("gbk//IGNORE", "UTF-8//IGNORE", $str);
            $str = mb_convert_encoding($str, "UTF-8", "gbk");

            現總結到這里,在下才疏學淺,如有紕漏,還望指正。

             

             

            posted on 2009-08-14 17:15 肥仔 閱讀(638) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫

            久久精品免费一区二区| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 国产精品久久久久jk制服| 国产麻豆精品久久一二三| 久久福利青草精品资源站| 国产成人综合久久精品尤物| 久久97久久97精品免视看| 亚洲日韩欧美一区久久久久我| 久久人人爽人人爽人人片av麻烦| 亚洲国产精品无码成人片久久| 无码人妻久久一区二区三区| 国产精品久久99| 亚洲精品97久久中文字幕无码| 久久夜色精品国产噜噜亚洲AV| 亚洲天堂久久精品| 99久久无色码中文字幕人妻| av无码久久久久久不卡网站| 久久综合九色欧美综合狠狠| 99国产欧美久久久精品蜜芽| 伊人久久大香线蕉无码麻豆| 久久精品国产亚洲一区二区| 久久精品国产欧美日韩99热| 青青青伊人色综合久久| 久久国产AVJUST麻豆| 91久久精品国产91性色也| 欧美亚洲色综久久精品国产| 久久久久国产| 中文精品久久久久国产网址 | 99久久er这里只有精品18| 无码国内精品久久人妻麻豆按摩| 久久99精品久久久久久久不卡 | 伊人久久精品无码二区麻豆| 久久久久亚洲精品男人的天堂| 久久亚洲精品成人av无码网站| 久久精品国产久精国产一老狼| 日本欧美国产精品第一页久久| 99久久精品国产一区二区蜜芽 | 国产高潮国产高潮久久久91| 国产精品天天影视久久综合网| 亚洲va久久久噜噜噜久久男同 | 国产亚洲色婷婷久久99精品91|