【问题标题】:PHP UTF-8 questions - If I create a string in PHP... is it in UTF-8?PHP UTF-8 问题 - 如果我在 PHP 中创建一个字符串......它是 UTF-8 吗?
【发布时间】:2010-10-08 03:59:36
【问题描述】:

在 PHP 中,如果我创建这样的字符串:

$str = "bla bla 这是我的字符串";

然后我可以使用 mbstring 函数将该字符串作为 UTF8 进行操作吗?

// 这行得通吗? $str = mb_strlen($str);

此外,如果我有另一个我知道是 UTF-8 的字符串(比如说它是一个 POST 表单值,或者来自数据库的一个 UTF-8 字符串),那么我可以连接这些二并没有任何问题?

// 这个怎么样,这行得通吗? $str = $str 。 $utf8_string_from_database;

【问题讨论】:

    标签: php unicode utf-8


    【解决方案1】:

    如果您的源代码是 UTF-8 格式,那么字符串就是 UTF-8 格式,如果不是——那就不是。由于您的示例字符串仅限英文,因此它是有效的 UTF-8。

    PHP 本身并不了解字符集。如果您将内容传递给 mb* 函数,它会将其视为 UTF-8 字符串。

    无论如何,如果我理解 UTF-8 正确,连接必须正常工作 :-) 只要确保 两个 字符串都是 UTF-8,否则你会得到 strange结果是字符串。

    【讨论】:

      【解决方案2】:

      第一个问题:这取决于字符串中的具体内容。

      在 PHP(直到 PHP5,无论如何)中,字符串只是字节序列。没有与它们相关的隐含或显式字符集;这是程序员必须跟踪的东西。因此,如果您只在引号之间放置有效的 UTF-8 字节(如果文件本身被编码为 UTF-8,则相当容易),那么字符串将是 UTF-8,您可以安全地在其上使用 mb_strlen()。

      此外,如果您使用的是 mbstring 函数,则需要明确告诉它您的字符串是什么字符集,可以使用 mbstring.internal_encoding 或作为任何 mbstring 函数的最后一个参数。

      第二个问题:是的,有一些注意事项。

      两个独立有效的 UTF-8 字符串可以安全地按字节连接(如 PHP 的 . 运算符)并且仍然是有效的 UTF-8。但是,如果不自己做一些工作,您永远无法确定 POSTed 字符串是有效的 UTF-8。如果您仔细设置连接字符集,数据库字符串会更容易一些,因为大多数 DBMS 会为您进行任何转换。

      【讨论】:

      • 关于第二个答案,这就是为什么编码验证/转换必须是任何输入验证例程的一部分。为此,使用 PHP 流输入过滤器 (iconv) 将使您能够在应用程序中获取 UTF-8 字符串,而无需使用手动循环和 MB/Iconv 函数。学习从 php://input 流包装器获取输入是关键。
      【解决方案3】:

      确保在执行任何此操作之前将您的 default_charset 指令设置为 UTF-8。

      要么直接修改php.ini,要么在运行时使用

      <?php
      
      ini_set( 'default_charset', 'UTF-8' );
      

      【讨论】:

      • 所有这些都是控制发送到客户端的标头。它实际上并不影响 PHP 如何处理字符串。
      • 它做的不止这些。尝试使用默认字符集 ISO-8859-1 执行 urldecode('%C3%A9'),然后再次使用默认字符集 UTF-8。但你是对的,它与 PHP 如何在位级别处理字符串无关。
      • 您会看到不同结果的唯一原因是您的浏览器对这些字节的解释不同。就像我说的那样,它不会影响 PHP 实际处理字符串的方式,不管怎样。
      • 我并不是要在这里开始争论,但我认为你没有理解我的意思。我说的是如何将字符串“%C3%A9”解释为单个 2 字节序列或两个 1 字节序列。不管有没有浏览器,这个问题都存在,尽管这肯定是它发生最多的地方。
      • 问题是关于 PHP 本身如何处理字节序列。设置 default_charset 对 PHP 如何处理字节序列没有任何影响。我想我们都同意这一点。
      猜你喜欢
      • 2016-05-31
      • 2011-11-30
      • 1970-01-01
      • 2018-09-07
      • 2011-06-05
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多