HTML-将数据库中的英镑符号£显示为?即使设置了charset=UTF-8

7
我们有许多手动输入的数据库数据,其中包含许多英镑符号(£)。原始用户从某个地方复制/粘贴了镑符号,我不确定是从哪里复制/粘贴的(我不确定是否重要...)。
无论如何,在PHP页面上打印数据时,英镑符号显示为替换字符。该页面中有<meta charset="utf-8"/>。在浏览器中,如果将编码更改为ISO-8859-1,则英镑符号将正确显示。
经过一番搜索,我得出结论:原始数据录入人员将一个ISO-8859-1编码的英镑符号复制/粘贴到了数据库中。因此,除非使用ISO-8859-1呈现页面,否则它将不能正确显示。
以下是Chrome的标头信息:
Request URL:http://www.mysite.com/test.php
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:X-Mapping-goahf....
Host:www.mysite.com
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Response Headersview source
Connection:Keep-Alive
Content-Type:text/html; charset=UTF-8
Date:Wed, 07 Dec 2011 22:38:14 GMT
Server:Apache/2.2
Transfer-Encoding:chunked

此外,MySQL表格显示它使用的是默认的latin1_swedish_ci编码。

那么我该如何解决这个问题呢?我对字符编码的工作原理以及将字符从一个地方复制/粘贴到另一个地方会发生什么并不了解。

我尝试访问了这个页面:

http://www.fileformat.info/info/unicode/char/a3/browsertest.htm

将英镑符号复制并粘贴到数据库中,以为这样就可以解决问题,但似乎并没有...我该如何将数据库中的英镑符号转换为UTF-8编码的英镑符号,而不是ISO-8859-1?

2个回答

6
无论原始的英镑符号从哪里复制而来,也无论它以何种编码存储在数据库中,这都不重要。数据库是基于字符级别工作的,这意味着如果您要求它存储“£”字符,它就会存储“£”字符;具体发生了什么以及使用了什么编码进行存储是实现细节,与此无关。
您所缺少的是“连接编码”。当您连接到数据库时,您隐式或显式地使用某个字符集与其通信。这意味着您发送到数据库的任何字节都应该表示该编码中的字符(因此数据库知道它所接收到的字符),并且您从数据库接收到的任何文本数据都将以该编码进行编码(因此您知道如何处理结果)。连接编码的默认值通常是Latin-1字符集(又称ISO-8859-1)。因此,当您从数据库接收到“£”符号时,它会即时将其转换为Latin-1,无论它在数据库中以何种编码存储。因此,您接收到的“£”符号是以Latin-1编码的,并且将其原样输出到您的页面上,但您正在指定浏览器将页面解释为UTF-8。当然,这会导致字符被错误解释。
您可以通过多种方式更改连接默认值,包括在MySQL配置中,使用客户端库中的某些方法(您未指定),或在连接到数据库后发出查询“SET NAMES utf8;”。

“SET NAMES utf8” 工作得非常完美。我正在使用共享数据库,因此不可能更改 MySQL 的配置。感谢这个课程!另外,为什么简单地将我的表(或列)排序规则设置为“utf8_general_ci”没有任何影响呢? - Jake Wilson

1

你不能简单地采用utf8元标记来显示一个编码中的原始文本。

我不知道coding是什么latin1_swedish_ci,但很可能它是iso-8859-1的别名。所以,要么你将编码转换为UTF-8,要么你修复元标记以显示正确的编码。

如果你要进行转换,我建议使用iconv。你可能还需要确保mysql也知道新的编码。其他人似乎已经在http://drupal.org/node/62258中处理过了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接