zoukankan      html  css  js  c++  java
  • 编程乱码问题初步探索

    简介:这是编程乱码问题初步探索的详细页面,介绍了和php,php, mysql, 乱码 编程乱码问题初步探索有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=344668' scrolling='no'>

    [分享]编程乱码问题初步探索

    作者:马顺仁

    相信很多朋友在写程序的过程中都受到过乱码的骚扰,那么今天我就这个问题来同大家探讨一

    下。

    乱码的问题分为很多种,很多人一见到有乱码就开始骂mysql,其实很多情况下并不是mysql

    成的。

    从乱码产生的原因来分析,乱码的产生一般有以下几种情况。

    1、网页编码与程序编码不一致的问题

    所谓的网页编码问题就是指你的html代码中定义的“ charset” ,例如以下这段代码:

     1 <head>
     2 
     3 <title>Chat Tutorial Application</title>
     4 
     5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     6 
     7 <meta name="language" content="en" />
     8 
     9 <meta name="author" content="Padraic Brady" />
    10 
    11 <link rel="stylesheet" href="public/styles/chat.css" type="text/css" />
    12 
    13 <script src="public/javascript/scriptaculous/lib/prototype.js"
    14 
    15 type="text/javascript"></script>
    16 
    17 <script src="public/javascript/scriptaculous/src/scriptaculous.js"
    18 
    19 type="text/javascript"></script>
    20 
    21 <script src="javascript/chat.js" type="text/javascript"></script>
    22 
    23 </head>

      

    他设置了浏览器端采用gb2312的字符集,此时如果程序使用的是utf8的编码(就是指以什么样

    的编码来编写的程序,一般在编辑器中设置),那么就会产生乱码。

    此时的解决方法就是把charset的值改为utf8

    2、代码本身就存在乱码问题

    这种情况是指你的代码本身就存在乱码问题。造成这种情况的原因一般是你以另一种编码格式

    修改了你的代码后并做了保存,这样你的程序中就有几种编码形式的代码,那么输出的时候自然就

    会有乱码。 这类问题相对来说比较容易解决, 只要人工找到那段有乱码的代码, 然后修改就行了 (很

    多编辑器可以完成这个工作)。

    3、mysql 的问题(此次讨论仅围绕mysql5.0 之后的版本展开)

    现在再来看最容易造成乱码,也是最容易让人迷糊的mysql乱码问题。

    要说mysql乱码,得先从mysql的几个参数说起,从mysql5开始,多了几个设置字符集的系统变

    量:

    character_set_client 客户端字符集

    character_set_connection 客户端与服务器端连接采用的字符集

    character_set_results SELECT查询返回数据的字符集

    character_set_database 数据库采用的字符集

    乱码问题一般是由于以上几个变量设置错误造成的,很多人在请教乱码问题的时候,一般都会

    得到一个这样的答案:“ 你先set names一下” 。

    那么set names是什么呢? set names实际上就是同时设置了character_set_client,

    character_set_connection, character_set_results这三个系统变量。

    例如set names 'gbk'等同于:

    set @@character_set_client = 'gbk'
    
    set @@character_set_connection = 'gbk'
    
    set @@character_set_results = 'gbk'

      

    很多情况下, 这样设置了之后就能把乱码问题解决了。 但是还是不能完全避免出现乱码的可能,

    为什么呢?

    因为character_set_client,character_set_connection这两个变量仅用与保证与

    character_set_database编码的一致,而character_set_results则用与保证SELECT返回的结果与

    程序的编码一致。

    例如,你的数据库(character_set_database)用的是utf8的字符集,那么你就要保证

    character_set_client,character_set_connection也是utf8的字符集。而你的程序也许采用的并

    不是utf8,比如你的程序用的是gbk,那么你若把character_set_results也设置为utf8的话就会出

    现乱码问题。此时你应该把character_set_results设置为gbk。这样就能保证数据库返回的结果与

    你的程序的编码一致。

    下面我给出一段用于设置字符集的代码(其中用到了一个我自己写的db库,相信应该不影响阅

    读):

    <?
    
    //假设我们的程序采用的是utf8的字符集
    
    $program_char = 'utf8';
    
    //先检查mysql的版本号,如果版本号大于4我们才可以设置这些系统变量(mysql4还没有这些系统变
    
    量)
    
    $version = current($db->fetch_one('SELECT VERSION()'));
    
    if (substr($version, 0, 1) > 4)
    
    {
    
    //取出当前数据库的字符集
    
    $sql = 'SELECT @@character_set_database';
    
    $char = current($db->fetch_one($sql));
    
    //将客户端字符集(character_set_client)和连接字符集(character_set_connection)
    
    设置为与数据库字符集(character_set_database)一致
    
    $db->query('SET @@character_set_client = "' . $char . '"');
    
    $db->query('SET @@character_set_connection = "' . $char . '"');
    
    //将SELECT查询返回数据的字符集设置为与当前程序的字符集一致
    
    $db->query('SET @@character_set_results = "' . $program_char . '"');
    
    }
    
    ?>

      

    到此应该就可以解决绝大多数我们遇到的乱码问题了,另外还必须强调的是,有时候乱码的出

    现有可能是以上几种原因混合造成的。

    对于这样的问题处理起来就比较的麻烦。因为首先要保证你在数据库中保存的数据的字符集与

    数据库的字符集是一致的。如果你在一个utf8的数据库中保存了GBK字符数据(如果你页面的编码

    与数据库的编码不一致,那么产生这个问题的可能性就很大),那么假设以上的设置都正确,结果

    还是会出现乱码的问题。不过这类问题一旦确定了产生的原因,那么就还是有办法解决的,比如刚

    才我举的这个例子。

    我们如果能确保其他环节的设置都是正确的,并且能够确认是由于把gbk的数据存到了utf8的

    数据库中而造成的乱码,那么我就可以把这些数据从数据库中取出来之后再用iconv()转换编码也

    是可以的。

    总而言之,我们应当尽量的保证数据库中的数据是正确的,那么问题处理起来就相对简单了。

    说了一大堆可能把你给弄迷糊了,我将其总结为以下四点,便于大家记忆。

    1、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;

    2、要保证通讯的字符集与数据库的字符集一致,即character_set_client,

    character_set_connection与character_set_database一致;

    3、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;

    4、要保证程序编码与浏览器编码一致,即程序编码与<meta http-equiv="Content-Type"

    content="text/html; charset=?"/>一致。

    捍卫自己的梦想!
    原文地址:http://www.cnblogs.com/c3055/archive/2011/08/13/2137455.html

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/344668.html pageNo:4
  • 相关阅读:
    周末之个人杂想(十三)
    PowerTip of the DaySorting Multiple Properties
    PowerTip of the DayCreate Remoting Solutions
    PowerTip of the DayAdd Help to Your Functions
    PowerTip of the DayAcessing Function Parameters by Type
    PowerTip of the DayReplace Text in Files
    PowerTip of the DayAdding Extra Information
    PowerTip of the DayPrinting Results
    Win7下IIS 7.5配置SSAS(2008)远程访问
    PowerTip of the DayOpening Current Folder in Explorer
  • 原文地址:https://www.cnblogs.com/ooooo/p/2240622.html
Copyright © 2011-2022 走看看