我正在尝试使用ucfirst()来大写字符串的第一个字母,但是当字符串包含éàçîô时......它不会改变它。
字符串
GÉNIEIVIVIL
应该返回
Géniecivil
但返回
GÉniecivil
正如你所看到的,它忽略了第二个字母“É”是小写的。我知道它是编码之王(我使用的是UTF-8)。有人知道如何解决这个问题吗?
修改
我没有mbstring enable,还有其他任何解决方案吗?
答案 0 :(得分:1)
首先ucfirst()执行它所说的内容,大写第一个字符。因此第二个角色和其他角色不会像你想要的那样调整。你需要strtolower()另一个角色(这样做时可能会遇到类似的特殊问题,但是在我的例子中我也给了你一个答案)。
现在对于mb_ucfirst(),如果存在将使用本机php函数或者模拟它,你可以在它们不存在时定义你自己的mb_strtoupper()和mb_substr()但是对于这个问题,我把所有内容都包含在一个中功能
所以推荐的功能是:
<?php
if (!function_exists('mb_ucfirst'))
{
function mb_ucfirst($string)
{
if (function_exists('mb_strtoupper') && function_exists('mb_substr'))
{
return mb_strtoupper(mb_substr($string, 0, 1), 'UTF-8').mb_substr($string, 1);
}
else
{
// Credit to Quicker at http://php.net/manual/en/function.ucfirst.php
// If it does not work, replace it with another utf8 ucfirst function
if ($string{0} >= "\xc3")
{
return ($string{1} >= "\xa0"
? ($string{0}.chr(ord($string{1})-32))
: ($string{0}.$string{1})).substr($string, 2);
}
return ucfirst($string);
}
}
}
?>
附加说明
您可能也对该库感兴趣:https://github.com/fluxbb/utf8 - 大多数编码函数在/core/native.php中,在/ functions中有ucfirst()等。那个可能比我的测试更多,甚至认为我喜欢我的小矿只看你的需要。
包含许多不同功能的完整示例
警告:如果你没有mb_string模块,你可能需要稍微调整一下代码。
<?php
mb_internal_encoding('UTF-8'); // make sure internal encoding is in UTF-8
function escape_html($string)
{
$charset = 'UTF-8';
return htmlspecialchars($string, ENT_QUOTES, $charset);
}
/*
function mb_ucfirst($str)
{
$currentEncoding = mb_internal_encoding();
mb_internal_encoding('UTF-8');
preg_match_all("~^(.)(.*)$~u", $str, $arr);
$str = mb_strtoupper($arr[1][0]).$arr[2][0];
mb_internal_encoding($currentEncoding);
return $str;
}*/
if (!function_exists('mb_ucfirst'))
{
function mb_ucfirst($string)
{
if (function_exists('mb_strtoupper') && function_exists('mb_substr'))
{
return mb_strtoupper(mb_substr($string, 0, 1), 'UTF-8').mb_substr($string, 1);
}
else
{
// Credit to Quicker at http://php.net/manual/en/function.ucfirst.php
// If it does not work, replace it with your favorite utf8 ucfirst function
if ($string{0} >= "\xc3")
{
return ($string{1} >= "\xa0"
? ($string{0}.chr(ord($string{1})-32))
: ($string{0}.$string{1})).substr($string, 2);
}
return ucfirst($string);
}
}
}
$testTexts = array(
'GÉNIE CIVIL',
'gÉnie civil',
'Génie civil',
'GENIE CIVIL',
'Epinard',
'ÉPinard',
'épinard',
'epinard',
'é',
'Ç',
'ç',
);
// Credit to leha_grobov php.net/strtolower, I inverted it ;-)
function strtoupper_utf8($string)
{
$convert_from = array(
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
"v", "w", "x", "y", "z", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï",
"ð", "ñ", "ò", "ó", "ô", "õ", "ö", "ø", "ù", "ú", "û", "ü", "ý", "а", "б", "в", "г", "д", "е", "ё", "ж",
"з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
"ь", "э", "ю", "я"
);
$convert_to = array(
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
"V", "W", "X", "Y", "Z", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï",
"Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж",
"З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ъ",
"Ь", "Э", "Ю", "Я"
);
return str_replace($convert_from, $convert_to, $string);
}
// Credit to leha_grobov php.net/strtolower, I twicked it ;-)
function ucfirst_utf8_1($string)
{
$convert_from = array(
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
"v", "w", "x", "y", "z", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï",
"ð", "ñ", "ò", "ó", "ô", "õ", "ö", "ø", "ù", "ú", "û", "ü", "ý", "а", "б", "в", "г", "д", "е", "ё", "ж",
"з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
"ь", "э", "ю", "я"
);
$convert_to = array(
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
"V", "W", "X", "Y", "Z", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï",
"Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж",
"З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ъ",
"Ь", "Э", "Ю", "Я"
);
return str_replace($convert_from, $convert_to, mb_substr($string, 0, 1)).mb_substr($string, 1);
}
// Credit to Quicker at http://php.net/manual/en/function.ucfirst.php
function ucfirst_utf8_2($stri)
{
if($stri{0}>="\xc3")
{
return (($stri{1}>="\xa0")
? ($stri{0}.chr(ord($stri{1})-32))
: ($stri{0}.$stri{1})).substr($stri,2);
}
return ucfirst($stri);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Test ucfirst()</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style>
table {
border-collapse: collapse;
}
td, th {
border: 1px solid black;
padding: 5px;
}
</style>
</head>
<body>
<table>
<tr>
<th>$t</th>
<th>ucfirsdt($t)</th>
<th>ucfirst(strtolower($t)</th>
<th>mb_ucfirst($t)</th>
<th>strtoupper_utf8($t)</th>
<th>ucfirst_utf8_1($t);</th>
<th>ucfirst_utf8_2($t);</th>
<tr>
<?php foreach ($testTexts as $t): ?>
<tr>
<td><?php echo escape_html($t); ?></td>
<td><?php echo escape_html(ucfirst($t)); ?></td>
<td><?php echo escape_html(ucfirst(strtolower($t))); ?></td>
<td><?php echo escape_html(mb_ucfirst($t)); ?></td>
<td><?php echo escape_html(strtoupper_utf8($t)); ?></td>
<td><?php echo escape_html(ucfirst_utf8_1($t)); ?></td>
<td><?php echo escape_html(ucfirst_utf8_2($t)); ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>