我想确保我所知道的有关 UTF-8 的一切都是正确的。我已经尝试使用 UTF-8 一段时间了,但我不断遇到越来越多的错误和其他奇怪的事情,这使得拥有 100% UTF-8 网站几乎不可能。总有一些地方是我似乎想念的。也许这里有人可以更正我的列表或确定它,这样我就不会错过任何重要的事情。
Database
每个站点都必须在某个地方存储数据。无论您的 PHP 设置是什么,您还必须配置数据库。如果您无法访问配置文件,请确保“设置名称“utf8”“一旦连接。另外,请确保使用utf8_unicode_ci https://stackoverflow.com/questions/766809/whats-the-difference-between-utf8generalci-and-utf8unicodeci在您所有的桌子上。这里假设 MySQL 作为数据库,您必须更改其他数据库。
Regex
我做了很多正则表达式更复杂 https://stackoverflow.com/questions/1191397/regex-to-match-values-not-surrounded-by-another-char比你的平均搜索替换。我必须记住使用“/u”修饰符,这样PCRE 不会损坏我的琴弦 http://www.phpwact.org/php/i18n/utf-8#u_pcre_utf8_pattern_modifier。然而,即便如此,也有显然仍然有问题 http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php#54805.
字符串函数
所有默认字符串函数(strlen()、strpos() 等)应替换为多字节字符串函数 http://www.php.net/manual/en/ref.mbstring.php查看字符而不是字节。
Headers您应该确保您的服务器返回正确的标头,以便浏览器知道您尝试使用的字符集(就像您必须告诉 MySQL 一样)。
header('内容类型:text/html;
字符集=utf-8');
将正确的 标记放在页面头部也是一个好主意。尽管实际的标头会覆盖它们,但如果它们不同的话。
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
问题
当页面加载时,我是否需要将从用户代理(HTML 表单和 URI)收到的所有内容转换为 UTF-8,或者我是否可以保留字符串/值不变,并且仍然通过这些函数运行它们而不会出现问题?
如果我确实需要将所有内容转换为 UTF-8 - 那么我应该采取什么步骤?mb_检测_编码 https://www.php.net/manual/en/function.mb-detect-encoding.php似乎是为此而构建的,但我不断看到人们抱怨它并不总是有效。mb_check_encoding http://us.php.net/manual/en/function.mb-check-encoding.php#89286似乎也无法区分正确的 UTF-8 字符串和格式错误的字符串。
PHP 在内存中存储字符串的方式是否不同,具体取决于它使用的编码(例如文件类型),还是仍然像常规字符串一样存储,其中某些字符的解释方式不同(例如 & 与 HTML 中的 & )。 罢工>查佐马库斯 https://stackoverflow.com/questions/558033/php-utf-8-questions-if-i-create-a-string-in-php-is-it-in-utf-8/558125#558125回答这个问题:
在 PHP(至少 PHP5)中,字符串
只是字节序列。有
没有隐含或显式的字符集
与他们有联系;那是某事
程序员必须跟踪。
如果将非 UTF-8 字符串提供给 mb_* 函数,它会导致问题吗?
如果 UTF 字符串编码不正确,是否会出现问题(例如正则表达式中的解析错误?),或者只是将实体标记为错误(html)?编码不正确的字符串是否有可能因字符串错误而导致函数返回 FALSE?
我听说您也应该将表单标记为 UTF-8 (accept-charset="UTF-8"),但我不确定这样做的好处是什么..?
UTF-16 是为了解决 UTF-8 的限制而编写的吗?就像 UTF-8 字符空间不足一样吗? (Y2(UTF)k?)
功能
以下是我发现的几个自定义 PHP 函数,但我没有任何方法来验证它们是否确实有效。也许有人有一个我可以使用的例子。首先是转换为UTF8() https://stackoverflow.com/questions/910793/php-detect-encoding-and-make-everything-utf-8/910899#910899然后是来自 wordpress 的似乎_utf8。
function seems_utf8($str) {
$length = strlen($str);
for ($i=0; $i < $length; $i++) {
$c = ord($str[$i]);
if ($c < 0x80) $n = 0; # 0bbbbbbb
elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb
elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb
elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb
elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb
elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b
else return false; # Does not match any model
for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
return false;
}
}
return true;
}
function is_utf8($str) {
$c=0; $b=0;
$bits=0;
$len=strlen($str);
for($i=0; $i<$len; $i++){
$c=ord($str[$i]);
if($c > 128){
if(($c >= 254)) return false;
elseif($c >= 252) $bits=6;
elseif($c >= 248) $bits=5;
elseif($c >= 240) $bits=4;
elseif($c >= 224) $bits=3;
elseif($c >= 192) $bits=2;
else return false;
if(($i+$bits) > $len) return false;
while($bits > 1){
$i++;
$b=ord($str[$i]);
if($b < 128 || $b > 191) return false;
$bits--;
}
}
}
return true;
}
如果有人感兴趣,我找到了一个很好的示例页面可以使用测试 UTf-8 时 http://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html.