ucfirst()带重音,没有mbstring启用

时间:2012-12-18 19:58:54

标签: php

我正在尝试使用ucfirst()来大写字符串的第一个字母,但是当字符串包含éàçîô时......它不会改变它。

字符串

  

GÉNIEIVIVIL

应该返回

  

Géniecivil

但返回

  

GÉniecivil

正如你所看到的,它忽略了第二个字母“É”是小写的。我知道它是编码之王(我使用的是UTF-8)。有人知道如何解决这个问题吗?

修改

我没有mbstring enable,还有其他任何解决方案吗?

1 个答案:

答案 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>