[英]utf8_encode function purpose
假设我用 UTF-8 对我的文件进行编码。
在 PHP 脚本中,将比较一个字符串:
$string="ぁ";
$string = utf8_encode($string); //Do i need this step?
if(preg_match('/ぁ/u',$string))
//Do if match...
它的那个字符串真的是 UTF-8 没有 utf8_encode() function? 如果您使用 UTF-8 对文件进行编码,则不需要此 function?
如果您阅读utf8_encode
的手册条目,它会将 ISO-8859-1 编码字符串转换为 UTF-8 。 function 这个名字是一个可怕的误称,因为它暗示了某种必要的自动编码。 事实并非如此。 如果您的源代码保存为 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"
。 它不关心引号之间到底是什么,它只会按原样使用它。
PHP 一般不关心字符串编码,字符串是 PHP 内的二进制数据。 所以如果你需要编码,你必须知道字符串中数据的编码。 问题是:在您的情况下,编码是否重要?
如果您将字符串变量内容设置为类似的内容:
$string="ぁ";
它
不会
包含 UTF-8。
相反,它包含一个不是有效 UTF-8 字符的二进制序列。
这就是浏览器或编辑器显示问号或类似内容的原因。
因此,在您打开 go 之前,您已经看到某些事情可能与预期不符。
(原来它是我最后缺少的字体)
这也表明您在编辑器中的文件支持 UTF-8 或其他一些 unicode 编码。 请记住以下几点:一个文件 - 一种编码。 如果您将字符串存储在文件中,则它位于该文件的编码中。 检查您的编辑器以哪种编码保存文件。 然后你知道字符串的编码。
让我们假设它是一些有效的 UTF-8 像这样(支持我的字体):
$string="ä";
然后,您可以稍后对字符串进行二进制比较:
if ( 'ä' === $string )
# do your stuff
因为它在同一个文件中,并且 PHP 字符串是二进制数据,所以这适用于每种编码。 因此,如果您使用二进制安全的函数,通常不需要重新编码(更改编码)数据 - 这意味着数据的编码不会更改。
对于正则表达式编码确实起作用。 这就是为什么有u
修饰符来表示您想让表达式在 unicode 编码数据上工作。 但是,如果数据已经是 unicode 编码,则无需在使用preg_match
之前将其更改为 unicode 。 但是,对于您的代码示例,根本不需要正则表达式,简单的字符串比较就可以了。
概括:
$string="ä";
if ( 'ä' === $string )
# do your stuff
您的字符串不是 utf-8 字符,因此无法匹配它,因此您需要对其进行 utf8_encode 编码。 尝试将 PHP 文件编码为 utf-8(使用 Notepad++ 之类的东西),没有它也可以工作。
概括:
utf8_encode()
function 会将给定字符串中的每个字节编码为 UTF-8。 无论以前使用什么编码来存储文件。 它的目的是编码尚未 UTF-8 的字符串¹。
1.-正确使用此 function 将 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
function 似乎可以与其他编码一起使用:如果要编码的字符串仅包含与 ISO-8859-1 编码具有相同值的字符(例如,在 Windows-1252 00-EF & A0-FF
位置),则它可以工作。
我们应该考虑到,如果 function 接收到 UTF-8 字符串(编码为 UTF-8 的文件)将再次编码该 UTF-8 字符串并将产生垃圾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.