5

在过去的几天里,我一直在努力将我的 PHP 代码库从 latin1 转换为 UTF-8。我已经阅读了两个主要的解决方案,要么用内置的多字节函数替换单字节函数,要么在 php.ini 文件中设置 mbstring.func_overload 值。

但是后来我在堆栈溢出时遇到了这个线程,thomasrutter 的帖子似乎表明多字节函数实际上并不是 UTF-8 所必需的,只要脚本和字符串文字以 UTF-8 编码即可。

我还没有找到任何其他证据这是否属实,如果事实证明我不需要将我的代码转换为 mb_functions 那么这将是一个真正的节省时间!任何人都可以对此有所了解吗?

4

8 回答 8

11

据我了解这个问题,只要您的所有数据都是 utf-8 中的 100% - 这意味着用户输入、数据库以及 PHP 文件本身的编码(如果您在其中包含特殊字符) - 这是真的 true 搜索和比较操作。正如@ntd 指出的那样,非多字节 strlen() 在包含多字节字符的字符串上运行时会产生错误的结果。

是一篇关于编码基础知识的好文章。

于 2009-11-16T20:02:35.847 回答
4

它们不是“必需的”,除非您使用它们替换的任何功能(并且您可能至少使用其中一个)或以其他方式明确需要扩展的功能,例如HTTP 处理

在努力实现 UTF-8 合规性时,我总是回退到PHP UTF-8 Cheatsheet并添加一个:需要更新 PCRE 模式才能使用u修饰符。

于 2009-11-16T20:17:10.203 回答
3

只要您检查或修改多字节字符串,就需要使用 mb_* 函数。一个非常简单的例子说明了原因:

$str = "abcžđščćöçefg";
mb_internal_encoding("UTF-8");

echo "strlen: ".strlen($str)."\n";
echo "mb_strlen: ".mb_strlen($str)."\n";

这打印出来:

strlen: 20
mb_strlen: 13
于 2009-11-16T20:19:44.113 回答
2

thomasrutter 表示搜索不需要特殊处理。例如,如果您需要检查 UTF8 字符串的长度,我看不出您如何使用 plain 来做到这一点strlen()

于 2009-11-16T20:10:44.363 回答
2

可能还需要诸如 mb_strtoupper 之类的函数。strtoupper 不会将 á 转换为 Á。

于 2009-11-16T20:55:27.037 回答
1

有许多函数期望字符串是单字节的(有些甚至假设它是 iso-8859-1)。在这些情况下,您需要了解自己在做什么,并可能使用替换功能。有一个相当全面的列表:http ://www.phpwact.org/php/i18n/utf-8

于 2009-11-16T20:39:22.483 回答
0

您可以使用扩展 PHP 中的多字节函数的 mbfunctions 库:

http://code.google.com/p/mbfunctions/

于 2009-12-22T10:12:51.803 回答
-1

您可以在 php.ini 文件中使用此 http://php.net/manual/en/mbstring.overload.php 设置,因此您无需更改代码。

但要小心,因为并非所有字符串函数都会自动更改。这是一个: http: //php.net/manual/en/function.substr-replace.php

于 2009-12-22T10:19:07.720 回答