我正在设置一个新服务器,并希望在我的Web应用程序中完全支持UTF-8.我过去曾在现有的服务器上尝试过此操作,但最终似乎不得不回归ISO-8859-1.
我在哪里需要设置编码/字符集?我知道我需要配置Apache,MySQL和PHP来执行此操作 - 是否有一些我可以遵循的标准清单,或者可能是在出现不匹配的地方进行故障排除?
这适用于运行MySQL 5,PHP,5和Apache 2的新Linux服务器.
我想确保我所知道的关于UTF-8的一切都是正确的.我一直试图使用UTF-8一段时间,但我不断遇到越来越多的错误和其他奇怪的事情,这使得看起来几乎不可能拥有100%的UTF-8网站.我似乎总是想念一个地方.也许这里有人可以纠正我的清单或者确定它,所以我不会错过任何重要的事情.
数据库
每个站点都必须在某处存储数据.无论您的PHP设置是什么,您还必须配置数据库.如果您无法访问配置文件,请确保在连接后立即" 设置名称'utf8' ".另外,请确保在所有表上使用utf8_ unicode_ ci.这假设MySQL是一个数据库,你必须为其他人改变.
正则表达式
我做了很多比你的普通搜索替换更复杂的正则表达式.我必须记住使用"/ u"修饰符,以便PCRE不会破坏我的字符串.然而,即便如此,显然仍然存在问题.
字符串函数
所有默认字符串函数(strlen(),strpos()等)都应该用多字节字符串函数替换,它们查看字符而不是字节.
标题 您应确保您的服务器返回正确的浏览器标题,以了解您尝试使用的字符集(就像您必须告诉MySQL).
header('Content-Type:text/html; charset = utf-8');
将正确的<meta>标记放在页眉中也是一个好主意.虽然实际的标题会覆盖它,但它们应该不同.
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
Run Code Online (Sandbox Code Playgroud)
问题
我是否需要在页面加载时将我从用户代理(HTML表单和URI)收到的所有内容转换为UTF-8,或者我是否可以保留字符串/值,并且仍然可以通过这些函数运行它们而不会出现问题?
如果我确实需要将所有内容转换为UTF-8 - 那么我应该采取哪些步骤?mb_detect_encoding似乎是为此而建的,但我一直看到人们抱怨它并不总是有效.mb_check_encoding似乎也有问题从一个格式错误的字符串中告诉一个好的UTF-8字符串.
PHP是否会根据所使用的编码(如文件类型)以不同的方式将字符串存储在内存中,或者它是否仍然像常规字符串一样存储,其中某些字符的解释方式不同(例如& vs&in HTML). chazomaticus回答了这个问题:
在PHP中(无论如何最多为PHP5),字符串只是字节序列.没有与之相关的隐含或显式字符集; 这是程序员必须跟踪的东西.
如果给mb_*函数一个非UTF-8字符串会导致问题吗?
如果UTF字符串编码不正确会出错(比如正则表达式中的解析错误?)或者它只是将实体标记为坏(html)?有不正确编码的字符串是否有可能导致函数返回FALSE,因为字符串不好?
我听说你应该把你的表格标记为UTF-8(accept-charset ="UTF-8"),但我不确定它的好处是什么......?
编写UTF-16是为了解决UTF-8的限制吗?就像UTF-8用尽人物的空间一样?(Y2(UTF)K?)
功能
以下是我发现的一些自定义PHP函数,但我无法验证它们是否真正有效.也许某人有一个我可以使用的例子.首先是convertToUTF8(),然后是来自wordpress的seem_utf8.
function seems_utf8($str) {
$length = strlen($str);
for ($i=0; $i < $length; $i++) {
$c = ord($str[$i]);
if ($c < 0x80) $n = 0; …Run Code Online (Sandbox Code Playgroud) 我已经多次看过这个问题了,但没有很好的分辨率.我有以下字符串:
$string = "<p>Résumé</p>";
Run Code Online (Sandbox Code Playgroud)
我想打印或回显字符串,但输出将返回<p>R?sum?</p>.所以我尝试htmlspecialchars()或者htmlentities()哪些输出<p>Résumé<p>和浏览器呈现<p>Résumé<p>.显然,我希望它能够呈现:
恢复
而且我使用的是UTF-8:
header("Content-type: text/html; charset=UTF-8");
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?为什么回声和打印输出?为任何特殊字符?为了澄清,字符串实际上是存储在数据库中的整个html文件.现实世界的应用不仅仅是一条小线.
我有一个内容的mysql表
结构在这里:

现在我有一条记录:

我想阅读并打印此表的内容为html这是我的代码:
<?php
include("config.php");
$global_dbh = mysql_connect($hostname, $username, $password)
or die("Could not connect to database");
mysql_select_db($db)
or die("Could not select database");
function display_db_query($query_string, $connection, $header_bool, $table_params) {
// perform the database query
$result_id = mysql_query($query_string, $connection)
or die("display_db_query:" . mysql_error());
// find out the number of columns in result
$column_count = mysql_num_fields($result_id)
or die("display_db_query:" . mysql_error());
// Here the table attributes from the $table_params variable are added
print("<TABLE $table_params >\n");
// optionally print a bold header at top …Run Code Online (Sandbox Code Playgroud) 我正在浏览 SO 答案,发现大多数用于替换多个空格的解决方案是:
$new_str = preg_replace("/\s+/", " ", $str);
Run Code Online (Sandbox Code Playgroud)
但在很多情况下,空格字符包括 UTF 字符,包括换行、换页、回车、不间断空格等。 这个 wiki描述了 UTF 定义了二十五个定义为空格的字符。
那么我们如何使用正则表达式替换所有这些字符呢?
我需要在PHP中创建一个可以处理所有地方的所有Unicode字符的应用程序 - 编辑字段,静态HTML,数据库.有人可以告诉我需要设置/用于实现这一目标的所有参数/功能的完整列表吗?