假设使用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对文件进行编码,则不需要此功能吗?
答案 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字符串并将产生垃圾。