使用substr()函数在多种语言中,包括阿拉伯语,使用PHP

8

我知道已经有很多关于在php中使用阿拉伯语的问题,但我无法解决我的问题,因此我发布了这个问题:

我有一个PhP网站,在英语中完美运行。现在,我想让它支持多种语言,包括法语、西班牙语、阿拉伯语,但我无法使用一个代码来实现。问题是,我在许多地方使用了substr(),翻译后的字符与substr()的预期效果不符。我也尝试了mb_substsr(),但没有用 :(

数据库中的字段为"utf8_general_ci",我已经在我的代码中放置了header('Content-type: text/html; charset=UTF-8');以允许UTF-8渲染。

问题要么是我得到了"???"代替确切的单词,要么是我得到了与substr()不符的错误单词。

请帮忙!!

3个回答

26

对于阿拉伯语单词: 我只想获取第二个位置上的字符。

$name = "MYNAME";
$Char = substr($Name,2,2);
echo $Char; // print N this okay.

但对于阿拉伯语的工作,例如كامل,它会返回问号。

case 1: $Char = substr($Name,0,1);     // Not Work and return question mark
case 2: $Char = substr($Name,1,1);     // Not Work and return question mark
case 3: $Char = substr($Name,0*2,1*2); // Work and return "ك"
case 3: $Char = substr($Name,1*2,1*2); // Work and return "ا"

所以我找到了解决方案:

$Char = mb_substr($Name,1,1,'utf-8');  // Work and return "ا".

请开始一个新的问题,而不是在现有问题中添加评论。 - Nitesh
这段代码对我来说在英语和阿拉伯语上都运行良好:<?php echo mb_substr($string, 0, 200); ?>希望它对你也有效。 - Waleed Asender

5

首先,忘记使用substr。如果您要对字符串进行UTF-8编码并拆分它们,则mb_substr是唯一可行的解决方案。

您还需要确保MySql的连接编码也是UTF-8。通过调用以下方法来实现:

mysql_set_charset('utf8');

mysql_connect后面立即执行此操作。如果您使用的是除mysql扩展(如PDO)之外的数据访问层,则可以使用等效的方法来执行此操作。

不要忘记 mb_internal_encoding("UTF-8");,对于PDO,您可以使用以下代码:$dbh = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); - maaudet
@tech-programmer:也许你尝试使用的方式不对? - Jon
@jon..我现在会尝试manhim的建议并告诉你结果。我检查了数据库,发现我从谷歌翻译的方式,存储在数据库中的也是同样的方式。例如 - نتائج الاستخدام المنتظم في الجلد أملس ناعم مطواع。 - Nitesh
嗨@jon和@Manhim--我刚试过使用mb_internal_encoding("UTF-8");但没有成功。我尝试在连接到数据库后以及查询之前立即尝试,但都没有起作用。请给予建议。 - Nitesh
@tech-programmer:你应该审查我们的建议,并尝试理解我们为什么这样做以及我们的建议的作用。通过StackOverflow远程调试第三方代码并不是人们喜欢做的事情。 - Jon
显示剩余3条评论

0
  1. 检查是否使用其他多字节(mb_*)函数来处理数据。
  2. 检查脚本是否保存为 UTF-8 文本文件。
  3. 检查连接到数据库后是否发送 SET NAMES utf8 查询。

关于第二项我没听懂你的意思,请解释一下。 - Nitesh
好的,对于从数据库中处理数据来说并不重要,但是如果你直接将这些特殊字符写入源代码中,它会为你节省很多头疼的麻烦。只需全部采用UTF-8方式,你就无需再处理任何这些问题 :) - Ondřej Mirtes
我已经准备好进行UTF8编码并且正在处理同样的问题,但仍然出现错误。 - Nitesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接