【问题标题】:utf8_encode function purposeutf8_encode 函数用途
【发布时间】:2011-10-05 17:30:10
【问题描述】:

假设我用 UTF-8 编码我的文件。

在 PHP 脚本中,将比较一个字符串:

$string="ぁ";
$string = utf8_encode($string); //Do i need this step?
if(preg_match('/ぁ/u',$string))
//Do if match...

没有 utf8_encode() 函数的 string 真的是 UTF-8 吗? 如果你用 UTF-8 编码你的文件不需要这个功能?

【问题讨论】:

  • 是的,但是如果我用 UTF-8 编码我的文件仍然是必要的?我的意思是它们是用 UTF-8 编码的,为什么要再次编码?

标签: php regex utf-8 character-encoding


【解决方案1】:

您的字符串不是 utf-8 字符,因此无法预匹配它,因此您需要对其进行 utf8_encode。尝试将 PHP 文件编码为 utf-8(使用 Notepad++ 之类的东西),没有它也可以工作。

【讨论】:

  • 我用 UTF-8 编码了我所有的文件,还需要那个函数吗?
  • 那么您是否尝试过删除 utf8_encode 函数并查看它是否匹配?
  • 如果我用 UTF-8 编码文件,它真的是 UTF-8 字符串吗?所以不需要这个功能。
  • 不,除非原始字符串来自可能不是 UTF-8 编码字符串的用户输入。即使这样 utf8_encode 也无法解决您的问题,因为它只能从 ISO-8859-1 转换。
【解决方案2】:

PHP 通常不关心字符串编码,字符串是 PHP 中的二进制数据。所以如果你需要编码,你必须知道字符串中数据的编码。问题是:编码对你来说重要吗?

如果您将字符串变量内容设置为类似的内容:

$string="ぁ";

它将包含 UTF-8。 相反,它包含一个不是有效 UTF-8 字符的二进制序列。这就是浏览器或编辑器显示问号或类似内容的原因。所以在你继续之前,你已经看到有些东西可能不像预期的那样。(原来它是我这边缺少的字体)

这也表明您在编辑器中的文件支持 UTF-8 或其他一些 unicode 编码风格。请记住以下几点:一个文件 - 一种编码。如果您将字符串存储在文件中,则它位于该文件的编码中。检查您的编辑器以哪种编码保存文件。那你就知道字符串的编码了。

让我们假设它是一些有效的 UTF-8(支持我的字体):

$string="ä";

然后您可以稍后对字符串进行二进制比较:

if ( 'ä' === $string )
  # do your stuff

因为它在同一个文件中并且 PHP 字符串是二进制数据,所以这适用于每种编码。因此,如果您使用二进制安全的函数,通常不需要重新编码(更改编码)数据 - 这意味着数据的编码不会更改。

对于正则表达式编码确实起作用。这就是为什么有 u 修饰符来表示您想让表达式在 unicode 编码数据上工作。但是,如果数据已经是 unicode 编码的,则在使用preg_match 之前无需将其更改为 unicode。但是,对于您的代码示例,根本不需要正则表达式,简单的字符串比较就可以了。

总结:

$string="ä";
if ( 'ä' === $string )
  # do your stuff

【讨论】:

  • 为什么你说$string="ぁ"; 不会包含UTF-8。相反,如果我将文件编码为 UTF-8,它包含一个不是有效 UTF-8 字符的二进制序列
  • 因为问号之类的字符。并非所有存在的二进制序列都是有效的 UTF-8 字符(或者准确地说是 unicode 代码点)。这就是为什么你的编辑器显示那个问号,二进制序列不能被“读取”为有效字符。
  • $string="ぁ"; 对我来说作为日语 あ 显示得非常好。那 一个有效的 UTF-8 字符。不知道你在那里看到了什么......
  • @hakre 从您的回答中我无法理解一些事情,但非常感谢您的回答和时间。
  • @deceze, @nEAnnam:好吧,在我的电脑上,它显示像[?] 这样的字符,从你们俩写的内容来看,我现在确定我缺少字体。因此,请忽略说它无效的部分,这是我的错(:D)。只要它有效,就像ä 一样,所以该部分应该仍然有效。编辑了答案。希望现在好多了。
【解决方案3】:

如果您阅读了utf8_encode 的手册条目,它会将 ISO-8859-1 编码字符串转换为 UTF-8。函数名是一个可怕的误称,因为它暗示了某种必要的自动编码。事实并非如此。如果您的源代码保存为 UTF-8 并且您将“あ”分配给 $string,那么 $string 将保存以 UTF-8 编码的字符“あ”。无需采取进一步行动。事实上,尝试将 UTF-8 字符串(错误地)从 ISO-8859-1 转换为 UTF-8 会出现乱码。

更详细地说,您的源代码被读取为字节序列。 PHP 用 ASCII 解释对它很重要的东西(所有关键字和运算符等)。 UTF-8 向后兼容 ASCII。这意味着,所有“普通”ASCII 字符都使用 ASCII 和 UTF-8 中的相同字节表示。因此," 被 PHP 解释为 ",无论它应该保存为 ASCII 还是 UTF-8。引号之间的任何内容,PHP 都简单地将其作为文字位序列。所以 PHP 将您的 "あ" 视为 "11100011 10000001 10000010"。它不关心引号之间到底是什么,它会按原样使用它。

【讨论】:

    【解决方案4】:

    总结:

    utf8_encode() 函数会将给定字符串中的每个字节编码为 UTF-8。 无论以前使用什么编码来存储文件。 它的目的是编码还不是 UTF-8 的字符串¹。

    1.- 正确使用此函数的方法是将 ISO-8859-1 字符串作为参数。 为什么?因为 Unicode 和 ISO-8859-1 在相同的位置有相同的字符。

                    [Char][Value/Position]          [Encoded Value/Position]
    [Windows-1252]  [€][80]                 ---->   [C2|80] Is this the UTF-8 encoded value/position of the [€]?    No
    [ISO-8859-1]    [¢][A2]                 ---->   [C2|A2] Is this the UTF-8 encoded value/position of the [¢]?    Yes
    

    该函数似乎适用于其他编码:如果要编码的字符串仅包含具有相同的字符 ISO-8859-1 编码的值(例如在 Windows-1252 00-EF & A0-FF 位置)。

    我们应该考虑到,如果函数接收到 UTF-8 字符串(编码为 UTF-8 的文件)将再次对该 UTF-8 字符串进行编码并且会产生垃圾。

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2011-03-09
      • 2011-11-14
      • 2010-11-28
      相关资源
      最近更新 更多