繁体   English   中英

utf8_encode function 用途

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM