Capitalize string with accented characters

2

I have a problem saving words with accents in MYSQL.

My bank is all set to ut8_unicode_ci and my php pages have <meta charset="utf-8"> .

This solved my initial problem with accents, but I wanted the data to be saved in the database with only the first letter of each capitalized word.

I found the ucwords() function that solved my problem, the system user could enter the name of the entire client in the upper box that the system saved the way I wanted it in the bank.

The problem is that if there are accents in the name it saves only the last letter before the accent. Ex: If the name is João da silva he saves just Jo. I would like some help with this since I have been researching for some time and still can not solve this. Here is an excerpt from the code:

function InsereMensalista()
{
    //TRAS AS VARIÁVEIS PARA O ESCOPO DA FUNÇÃO.
    global $conn, $nome, $email, $cpf, $rg, $tel, $celular, $celular2, $estado, $endereco, $bairro, $cidade, $placa1, $modelo1, $placa2, $modelo2, $mensalidade;

    //MUDA AS VARIÁVEIS PARA MINÚSCULO.
    $nome = strtolower($nome);
    $endereco = strtolower($endereco);
    $bairro = strtolower($bairro);
    $cidade = strtolower($cidade);
    $modelo1 = strtolower($modelo1);
    $modelo2 = strtolower($modelo2);

    // MUDA AS VARIÁVEIS COLOCANDO A PRIMEIRA LETRA DE CADA PALAVRA EM MAIÚsCULO ANTES DE INSERIR NO BANCO DE DADOS.
    $nome = ucwords($nome);
    $endereco = ucwords($endereco);
    $bairro = ucwords($bairro);
    $cidade = ucwords($cidade);
    $modelo1 = ucwords($modelo1);
    $modelo2 = ucwords($modelo2);

    //QUERY PARA INSERIR DADOS DIGITADOS NO FORMULÁRIO NO BANCO DE DADOS.
    $sql = "INSERT INTO mensalistas (id, nome, email, cpf, rg, telefone, celular, celular2, endereco, bairro, cidade, estado, placa1, modelo1, placa2, modelo2, mensalidade) 
    VALUES ('','$nome','$email','$cpf','$rg','$tel','$celular','$celular2','$endereco','$bairro','$cidade','$estado','$placa1','$modelo1','$placa2','$modelo2','$mensalidade')";

    //TENTA INSERIR OS DADOS NO BANCO DE DADOS.
    if($result = $conn->query($sql))
    {
        //EXIBE UM AVISO DE QUE O CADASTRO FOI EFETUADO COM SUCESSO.
        echo "<script type='text/javascript'>
        alert('Cadastro efetuado com sucesso!');
        location.href='cadastro_mensalista.php';
        </script> ";
    }
    else
    {
        //EXIBE UM AVISO DE QUE O USUÁRIO TENTOU INSERIR DADOS JÁ REGISTRADOS NO BANCO DE DADOS.
        echo "<script type='text/javascript'>
        alert('Você tentou inserir dados já cadastrados. Verifique os dados do cliente e tente novamente!');
        location.href='javascript:window.history.go(-1)';
        </script> ";
    }
}
    
asked by anonymous 26.10.2015 / 11:35

1 answer

7

ucwords() is one of the functions for string manipulation of php that does not support multibyte so it can not convert accented characters or other languages.

For each function that handles string there is a copy that works with multibyte characters, these functions have the prefix mb .

To capitalize your string use the mb_convert_case function and report the second argument as MB_CASE_TITLE other options are MB_CASE_UPPER and MB_CASE_LOWER

<?php 

$str = 'teste éverdade bla bla óooo ýabc';
echo mb_convert_case($str,  MB_CASE_TITLE);
echo ucwords($str);

Output:

Teste Éverdade Bla Bla Óooo Ýabc
Teste éverdade Bla Bla óooo ýabc
    
26.10.2015 / 12:48