utf8_encode功能目的

时间:2011-07-14 21:43:02

标签: php regex utf-8 character-encoding

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

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

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

它的字符串真的是没有utf8_encode()函数的UTF-8? 如果使用UTF-8对文件进行编码,则不需要此功能吗?

4 个答案:

答案 0 :(得分:11)

如果您阅读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"。它并不关心引号之间究竟是什么,它只是按原样使用它。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

你的字符串不是utf-8字符,所以它不能匹配它,因此你需要utf8_encode它。尝试将PHP文件编码为utf-8(使用类似Notepad ++的东西),它可以在没有它的情况下工作。

答案 3 :(得分:0)

要点:

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字符串并将产生垃圾。