我的 PHP 应用程序是否正确支持 UTF-8?

2024-04-14

我想确保我所知道的有关 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.


页面加载时,我是否需要将从用户代理(HTML 表单和 URI)收到的所有内容转换为 UTF-8

不可以。用户代理应该以 UTF-8 格式提交数据;如果不这样做,您将失去 Unicode 的好处。

确保用户代理以 UTF-8 格式提交的方法是提供包含以 UTF-8 编码提交的表单的页面。使用 Content-Type 标头(如果您希望保存表单并独立工作,也可以使用元 http-equiv)。

我听说你也应该将表单标记为 UTF-8 (accept-charset="UTF-8")

Don't.这在 HTML 标准中是一个好主意,但 IE 从来没有做到这一点。它本应声明允许的字符集的排他列表,但 IE 将其视为在每个字段的基础上尝试的附加字符集列表。因此,如果您有一个 ISO-8859-1 页面和一个“accept-charset="UTF-8"”表单,IE 将首先尝试将字段编码为 ISO-8859-1,如果存在非 8859-1里面的人物,then它将诉诸UTF-8。

但由于 IE 不会告诉你它使用的是 ISO-8859-1 还是 UTF-8,所以这对你来说毫无用处。您必须分别猜测每个字段正在使用哪种编码!没有用。省略该属性并将您的页面作为 UTF-8 提供;这是你目前能做的最好的事情。

如果 UTF 字符串编码不正确,就会出现问题

如果您让这样的序列进入浏览器,您可能会遇到麻烦。存在“超长序列”,它们以比所需更长的字节序列编码低编号的代码点。这意味着,如果您通过在字节序列中查找 ASCII 字符来过滤“

超长序列在 Unicode 早期就被禁止了,但微软花了很长时间才把它们整合在一起:直到 IE6 Service Pack 1 为止,IE 都会将字节序列“\xC0\xBC”解释为“this one来自W3。

如果您在 PHP 中使用 mb_ 函数,您might免受这些问题的影响。我不能肯定地说,因为当我还在编写 PHP 时 mb_* 是无法使用的脆弱的。

无论如何,这也是删除控制字符的好时机,控制字符是一个巨大且通常不被重视的错误来源。除了 W3 正则表达式删除的其他字符之外,我还会从提交的字符串中删除字符 9 和 13;还值得删除您知道不应该是多行文本框的字符串的普通换行符。

UTF-16 是为了解决 UTF-8 的限制而编写的吗?

不,UTF-16 是一种每个代码点两个字节的编码,用于使内存中的 Unicode 字符串索引更容易(从所有 Unicode 都适合两个字节的时代开始;Windows 和 Java 等系统仍然这样做)。与 UTF-8 不同,它与 ASCII 不兼容,并且在 Web 上几乎没有用处。但您偶尔会在保存的文件中遇到它,通常是 Windows 用户保存的文件,他们被 Windows 在“另存为”菜单中将 UTF-16LE 描述为“Unicode”所误导。

似乎_utf8

与正则表达式相比,这是非常低效的!

另外,请确保在所有表上使用 utf8_unicode_ci。

实际上,你可以不用这个,将 MySQL 视为只存储字节的存储,并在脚本中将它们解释为 UTF-8。使用 utf8_unicode_ci 的优点是它将与非 ASCII 字符的知识进行比较(排序并进行不区分大小写的比较),因此例如。 “ŕ”和“Ŕ”是同一个字符。如果您使用非 UTF8 排序规则,则应坚持使用二进制(区分大小写)匹配。

无论您选择哪种,请始终如一地执行:为表使用与连接相同的字符集。您要避免的是脚本和数据库之间的有损字符集转换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 PHP 应用程序是否正确支持 UTF-8? 的相关文章

  • 计算特定产品类别的购物车商品数量

    我试图仅从 WooCommerce 中的特定产品类别获取购物车中的商品数量 我正在为一家酒厂做一个网站 它有酒精和非酒精产品 所有葡萄酒都属于 葡萄酒 主类别或类别 ID 34 其下有许多子类别和产品 对于属于此类别的任何商品 我需要知道此
  • 使用 PHP 将 SVG 图像转换为 PNG

    我正在开发一个网络项目 该项目涉及动态生成的美国地图 根据一组数据为不同的州着色 这个 SVG 文件为我提供了一张很好的美国空白地图 并且很容易更改每个州的颜色 困难在于 IE 浏览器不支持 SVG 因此为了让我使用 svg 提供的便捷语法
  • preg_match 所有以@开头的单词?

    我对正则表达式不太确定 所以我不得不问你 如何用 PHP 判断字符串中是否包含以 开头的单词 例如我有一个像 This is for codeworxx 这样的字符串 我很抱歉 但我没有任何起点 希望你能帮忙 谢谢 萨沙 好的 谢谢你的结果
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql
  • curl 无法获取网页内容,为什么?

    我正在使用curl 脚本转到链接并获取其内容以进行进一步操作 以下是链接和curl脚本
  • 从 json 数组获取值并执行 sql 插入

    这是我的数组 json 1 Device ID a9a3346be4375a92 Date 2012 05 31 Time 15 22 59 Latitude 51 4972912 Longitude 0 1108178 2 Device
  • 未找到“MongoId”类(带有 MongoDB Doctrine 的 Zend 框架)

    我目前正在尝试将 MongoDB 与 ZendFramework 中的 Doctrine 集成 我做了很多教程 在 StackOverflow 或其他地方 但没有任何效果 我一步步按照教程进行操作 http www bigwisu com
  • HTTP_REFERER 返回 NULL,$_SERVER 中不存在密钥

    使用以来第一次 SERVER HTTP REFERER 它给了我NULL因此 当我做var dump SERVER the HTTP REFERER密钥不存在 我还尝试使用不同的浏览器和不同的网站访问网站 但没有结果 该网站在基于 Linu
  • ajax 会增加还是降低安全性?

    我正在创建一个网站 到目前为止它是纯 PHP 的 我在想 既然很少有人没有启用 JavaScript 我想知道为什么 也许我应该将我的网站创建为一个完全 PHP 的网站 而不使用任何 AJAX 难道是我想错了 可以肯定的是 如果我实施一些
  • PHP,文本从数据库中回显,没有换行,全部一体

    我的数据库中有一个长文本 从 php mayadmin 来看它看起来很好 但是当我将它回显到页面时 它会丢失所有格式 即没有新行 全部都在一个块中 有任何想法吗 Thanks 可能是因为换行符是 n 并且 html 想要 br 所以使用nl
  • 如何使用多个数据库设置 symfony 3 学说迁移?

    我在验证和更新模式时努力让 symfony doctrine 排除数据库视图 我第一次尝试没有教条迁移 看到这个问题 https stackoverflow com questions 46775200 symfony 3 doctrine
  • PHP URL 验证

    我知道有无数的线程问这个问题 但我一直无法找到一个可以帮助我解决这个问题的线程 我基本上试图解析大约 10 000 000 个 URL 的列表 确保它们根据以下标准有效 然后获取根域 URL 此列表包含您能想象到的几乎所有内容 包括类似的内
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 验证假名输入

    我正在开发一个允许用户输入日语字符的应用程序 我试图想出一种方法来确定用户的输入是否是日语假名 平假名 片假名或汉字 应用程序中的某些字段不适合输入拉丁文文本 我需要一种方法将某些字段限制为仅限汉字或仅限片假名等 该项目使用UTF 8编码
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • 在 Windows 上查看 PHP 文件夹

    我正在编写一个简单的 PHP 脚本来监视文件夹及其子文件夹的任何更改 新文件 修改 删除 然后执行操作 我将使用 Windows 上的命令行运行此脚本php f script php 我一直在寻找一种在 Windows 上观看具有 PHP
  • 使用 PHP 创建图表并导出为 PDF

    我正在寻找有关使用 PHP 创建图表的建议 我还希望能够将这些图表导出到 PDF 文档 我目前正在使用谷歌图表 但我不喜欢将我的所有信息发送到谷歌的想法 我更喜欢自己的托管解决方案 我见过很多 Flash 解决方案 但我不知道有什么方法可以
  • 准备好的语句需要 0 个参数,给定 1 个参数..,使用 php 手册示例 [重复]

    这个问题在这里已经有答案了 我直接从 php 手册示例中获取了这个 它几乎与我需要的相同 但我仍然收到此错误 有人可以告诉我我错过了什么吗 stmt link gt prepare SELECT obitBody Photo FROM tn
  • __callStatic():从静态上下文实例化对象?

    我对 PHP 中的 静态 和 动态 函数和对象如何协同工作感到困惑 特别是在 callStatic 方面 callStatic 的工作原理 您可以有一个普通的班级 MyClass 在班级内您可以 放置一个名为 callStatic 的静态函
  • PHP 文件上传帮助

    div align center div 这是我的代码

随机推荐