【发布时间】:2012-11-10 15:06:27
【问题描述】:
我从 db 得到一个 UTF-8 字符串,并试图回显它的第一个字符:
$title = $model->title;
echo $title[0];
我得到:�
怎么了?
【问题讨论】:
我从 db 得到一个 UTF-8 字符串,并试图回显它的第一个字符:
$title = $model->title;
echo $title[0];
我得到:�
怎么了?
【问题讨论】:
$first_char = mb_substr($title, 0, 1);
您需要使用 PHP 的多字节字符串函数来正确处理 Unicode 字符串:
http://www.php.net/manual/en/ref.mbstring.php
http://www.php.net/manual/en/function.mb-substr.php
您还需要在 HTML 的 <head> 中指定字符编码:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
或:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16" />
【讨论】:
li_directory (id, title, text, examples, time) 值 (1, 'Акраверш', '', 132170895跨度>
$title="Акраверш"; echo mb_substr($title, 0, 1,'UTF-16');
您需要考虑几件事:
header('Content-Type: utf-8');]mb_internal_encoding("UTF-8");
mb_substr 代替数组索引表示法【讨论】:
$title[0],那么做所有这些都不会解决任何问题。 @PaulS 说“你应该使用mb_substr”,但有人可以确认你必须使用mb_substr吗?如果是这样,我们不应该编辑这个公认的答案来添加这个关键点吗?
正如前面在其他问题中提到的,使用 PHP 时,当尝试获取子字符串时,它不理解多字节字符(例如,您使用 UTF8 时)。
其他答案没有提到的是你应该提示你想用于 mb_substr 的编码
所以,例如,我使用这个:
mb_substr( "Sunday", 0, 1,'UTF8'); // Returns S
mb_substr( "воскресенье", 0, 1,'UTF8'); // Returns в
【讨论】:
mb_internal_encoding 返回的任何编码。
默认情况下,PHP 字符串不理解多字节字符串,像索引这样的数组会切掉第一个字节,如果碰巧不在 ascii 范围内,你会得到这个结果。
使用mb_substr 方法。
【讨论】: