zoukankan      html  css  js  c++  java
  • php mysql 字符集(三) (转)

    http://bbs.csdn.net/topics/390097514

    gbk页面插入数据到utf8表,然后取出到gbk页面

    首先, 这个set names x等价于
    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    而这3个设置决定了不同阶段的字符集

    ------------------------------------

    如果不加set names utf8
    一般缺省情况下这3个设定都是latin1,你可以用show VARIABLES like 'character_set%'看一下

    ok,这时,
    字符集的变化情况是
    gbk(输入页面)->latin1(character_set_client)->latin1(character_set_connection)->utf8(数据库)->latin1(character_set_connection)->latin1(character_set_results)->gbk(输出页面)

    比如你输入一个"严"
    "D1CF"(输入的一个gbk字符,被解释为2个latin1字符,因为你的client是latin1)
    =>"D1""CF"(2个latin1字符ÑÏ)
    ->"c391""c38f"(2个utf8字符,进db,注意这时是4个字节,2个字符)
    ->"D1""CF"(2个latin1字符ÑÏ)
    没了....

    嗯?为啥没了还能在页面上看到正确的汉字"严"???

    如果你在页面上"查看源代码", 你会看到那是"乱码"(latin字符)
    这个是因为html页面是流方式输出到浏览器,浏览器只知道接受一串字符过来,然后根据你指定的编码,比如<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>
    来分析显示字符,注意2个latin1字符D1CF和一个gbk汉字严在二进制下是无法区分的,所以它就解释其为汉字,
    如果你charset=ISO-8859-1了,它就变"乱码"了

    -----------------------------------------------------------------

    好, 这下来说set names utf8后, 就是
    set character_set_client = utf8;
    set character_set_results = utf8;
    set character_set_connection = utf8;

    那么,字符集变化为
    gbk(输入页面)->utf8(character_set_client)->utf8(character_set_connection)->utf8(数据库)->utf8(character_set_connection)->utf8(character_set_results)->gbk(输出页面)

    那么"严"的变化为
    "D1CF"(输入的一个gbk字符,因为你client是utf8....被当成utf8字符)
    ->但是...好像不是合法的utf8字符....所以...(这步我没测试,到底转成了什么我也不知道)
    ->"乱码"(?个utf8字符)(存入数据库)
    ->"乱码"(原样取出并传到客户端,因为db和results都是utf8)
    页面上就更是乱码了,而且无法变化页面字符集来得到正确的汉字

    ----------------------------------------------------------

    所以,很多人都知道,你的这个情况应该set names gbk,就是
    set character_set_client = gbk;
    set character_set_results = gbk;
    set character_set_connection = gbk;

    那么,字符集变化为
    gbk(输入页面)->gbk(character_set_client)->gbk(character_set_connection)->utf8(数据库)->gbk(character_set_connection)->gbk(character_set_results)->gbk(输出页面)

    那么"严"的变化为
    "D1CF"(输入的一个gbk字符,因为你client是gbk,所以被正确解释成gbk字符)
    ->"e4b8a5"(一个utf8字符,进db,注意这时是3个字节,1个字符)
    ->"D1CF"(转回正确的gbk字符)
    这时你"查看源代码",应该也是正确的字符"严"

    ---------------------------------------------------------

  • 相关阅读:
    ASP.NET MVC 让@Html.DropDownList显示默认值
    ASP.NET MVC View向Controller提交数据
    ASP.NET MVC Controller向View传值的几种方式
    ASP.NET MVC3中Controller与View之间的数据传递总结
    net MVC中的模型绑定、验证以及ModelState
    30分钟LINQ教程
    使用Html.BeginForm来提交表单
    @Html.DropDownList
    uni-app页面导航栏透明背景
    nom install 报错
  • 原文地址:https://www.cnblogs.com/xihong2014/p/4371730.html
Copyright © 2011-2022 走看看