Gub*_*ooo 3 html mysql internationalization special-characters mojibake
我有一个mysql数据库表来存储国家名称和货币符号 - CHARSET已正确设置为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);
?>
请指教谢谢
当您看到"带有问号的奇怪方形符号"(也称为REPLACEMENT CHARACTER)时,通常指示您有一个80-FF(128-255)范围内的字节且系统正在尝试渲染它以UTF-8表示.
对于UTF-8中的单字节字符,整个字节范围无效,但在ISO-8859-1等西方编码中都非常常见.
当我查看您的页面并手动将字符编码从UTF-8切换到ISO-8859-1(在Firefox中使用View>> Character Encoding>> Western (ISO-8859-1))时,POUND SIGN会正确显示.
那么,那有什么不对?很难说 - 有几十个地方可以被犯规.但最有可能的是它在数据库级别.将表上的CHARSET设置为UTF8通常是不够的.在角色正确地在系统中移动之前,您的所有字符集和排序规则都必须按顺序排列.一个常见的陷阱是不正确地设置连接字符集,所以我从那里开始.
如果您需要更多指导,请告诉我.
要检查该值实际存储的字节数,请运行此查询.
SELECT hex( currency_symbol )
FROM country
WHERE country_name = 'UK'
Run Code Online (Sandbox Code Playgroud)
如果您看到,A3那么您知道该字符存储为ISO-8859-1.这意味着在写入DB期间或之前会出现问题.
如果您看到,C2A3那么您知道该字符存储为UTF-8.这意味着在从DB读取之后和写入浏览器之前会出现问题.
-- 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';
Run Code Online (Sandbox Code Playgroud)