代码之家  ›  专栏  ›  技术社区  ›  Gublooo

磅符号未显示在网页上

  •  3
  • Gublooo  · 技术社区  · 16 年前

    我有一个mysql数据库表来存储国家名称和货币符号-字符集已经正确设置为utf8。

    这是插入到表中的示例数据

    insert into country ( country_name, currency_name, currency_code, currency_symbol) values 
    ('UK','Pounds','GBP','£');
    

    当我在数据库中查看时——磅符号看起来很好——但是当我从数据库中检索到它并将其显示在网站上时——一个奇怪的方形符号会出现,里面有一个问号,而不是磅符号。

    编辑 在my.cnf中,characterset被设置为latin1-我将其更改为utf8-然后以root身份登录并运行\s-它返回

    Server characterset:    utf8
    Client characterset:    utf8
    

    排序规则

    -- Database
    SELECT default_collation_name
      FROM information_schema.schemata
     WHERE schema_name = 'swipe_prod';
    
    THIS DOES NOT RETURN ANYTHING
    
    -- Table
    SELECT table_collation
      FROM information_schema.tables
     WHERE TABLE_NAME = 'country';
    
    THIS RETURNS utf8_general_ci
    
    -- Columns
    SELECT collation_name
      FROM information_schema.columns
     WHERE TABLE_NAME = 'country';
    
    THIS RETURNS 7 ROWS but all have either null or utf8_general_ci
    

    PHP代码

    <?php
    $con = mysql_connect("localhost","user","123456");
    mysql_select_db("swipe_db", $con);
    $result = mysql_query("SELECT * FROM country where country_name='UK'");
    while($row = mysql_fetch_array($result))
    {
      echo $row['country_name'] . " " . $row['currency_symbol'];
    }
    mysql_close($con);
    ?>
    

    请教 谢谢

    7 回复  |  直到 12 年前
        1
  •  7
  •   Peter Bailey    16 年前

    当你看到“里面有问号的奇怪的方形符号”,也就是 REPLACEMENT CHARACTER ,这通常是一个指示符,指示您的字节在80-FF(128-255)范围内,并且系统正在尝试用UTF-8呈现它。

    整个字节范围对于UTF-8中的单字节字符无效,但在西方编码(如ISO-8859-1)中都很常见。

    当我查看您的页面并手动将字符编码从utf-8切换到iso-8859-1时(在firefox中 View & gt; Character Encoding & gt; Western (ISO-8859-1) )然后 POUND SIGN 正确显示。

    那么,怎么了?很难说,这里有很多地方都会被弄脏。但很可能是在数据库级别。将表上的字符集设置为utf8通常是不够的。在字符在系统中正常移动之前,您的所有字符集和排序规则都需要保持有序。常见的陷阱设置不正确 connection charsets ,所以我先从那里开始。

    如果你需要更多的指导,请告诉我。

    编辑

    要检查为该值实际存储了哪些字节,请运行此查询。

    SELECT hex( currency_symbol )
      FROM country
     WHERE country_name = 'UK'
    

    如果你看到 A3 然后您知道字符存储为ISO-8859-1。这意味着问题发生在写入数据库的过程中或之前。

    如果你看到 C2A3 然后您就知道该字符存储为UTF-8。这意味着问题发生在从数据库读取数据之后,以及写入浏览器之前。

    编辑2

    -- Database
    SELECT default_collation_name
      FROM information_schema.schemata
     WHERE schema_name = 'your_db_name';
    
    -- Table
    SELECT table_collation
      FROM information_schema.tables
     WHERE TABLE_NAME = 'country';
    
    -- Columns
    SELECT collation_name
      FROM information_schema.columns
     WHERE TABLE_NAME = 'country';
    
        2
  •  3
  •   Ben Harvey    12 年前

    把我的2便士削掉。我用 utf8_encode() 从数据库输出数据。这似乎也照顾其他角色。

        3
  •  1
  •   Tom Gullen    16 年前

    试用使用

    &pound;
    

    代替_符号,交替打印_符号,请执行以下操作:

    <%=replace(stringWithPoundInIt,"£","&pound;"%>
    
        4
  •  1
  •   Krabats    14 年前

    我也有同样的问题。我所做的是在连接到数据库(php)后立即运行此命令:

    mysql_query("SET NAMES utf8");
    

    希望这有帮助。

        5
  •  1
  •   ilight    14 年前

    我也遇到了同样的问题,在mysql数据库上运行select查询之前,我添加了下面的PHP代码,解决了这个问题。

    mysql_query("SET character_set_results=utf8", $link);
    
        6
  •  1
  •   ballyhoos    13 年前

    我自己也遇到了这个问题,并在输出阶段使用 mb_convert_encoding “。

    用你的例子…

    echo $row['country_name'] . " " . mb_convert_encoding($row['currency_symbol'], "UTF-8");

        7
  •  0
  •   tazphoenix    16 年前

    你可以退房 here 我不确定它是否有效,但请尝试一下,因为这很奇怪,我以前从未见过类似的东西。