Execute o trecho de codigo abaixo na linha de comando o observe o resultado:ini_set('display_errors', 1);error_reporting(E_ALL);header('Content-Type: text/plain; charset=utf-8');$utf8_word = 'GOIANIA';$ascii_word = iconv('UTF-8', 'US-ASCII//TRANSLIT', $utf8_word);echo $ascii_word, "\n";echo md5($ascii_word);echo "\n";No meu sistema(PHP 5.3.6-13ubuntu3.10 with Suhosin-Patch (cli)) a saida foi:GOIANIA1d92cfdaed61eba2c8dea6e670df9f38Certo, agora executando o mesmo script atraves do browser e do servidor web a saida e a seguinte:GOI?NIA848aa917b7d132a581c0d9f91bc1b03fHumm... Por que o mesmo script tem saidas diferentes quando executado na linha de comando e quando executado no servidor web?Mas o que este script faz mesmo? Ele simplesmente usa a funcao iconv para converter uma string codificada com UTF-8(GOIANIA) para codificacao US-ASCII, o nosso velho conhecido ASCII, usando transliteracao o que faz com que quando um caractere nao possa ser representado na codificacao alvo a funcao tenta usar um caractere da codificacao alvo que seja parecido. Mas ainda nao sabemos poque o script tem saidas diferentes em ambientes diferentes.Acontece que a funcao iconv e afetada pelo locale do ambiente, usando a funcao setlocale podemos verificar qual locale esta sendo usado:$current_locale = setlocale(LC_ALL, "0");echo "Current locale:$current_locale", "\n";No servidor web a resposta e "C" na linha de comando e "LC_CTYPE=pt_BR.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C", que e o locale configurado no meu sistema operacional. Ou seja enquando no servidor web o locale e C na linha de comando e utf-8. Entao e so ajustarmos o locale antes de chamar a funcao iconv para que ela tenha o mesmo comportamento em qualquer ambiente.ini_set('display_errors', 1);error_reporting(E_ALL);setlocale(LC_ALL, 'pt_BR.UTF-8');header('Content-Type: text/plain; charset=utf-8');$utf8_word = 'GOIANIA';$ascii_word = iconv('UTF-8', 'US-ASCII//TRANSLIT', $utf8_word);echo $ascii_word, "\n";echo md5($ascii_word);echo "\n";Mas existem algumas consideracoes a serem feitas, o locale configurado atraves da funcao setlocale deve estar instalado no servidor onde o codigo sera executado, caso contrario a funcao setlocale simplesmente retorna FALSE e o resultado pode ser diferente para cada ambiente quando demonstrado no inicio do texto. Outra consideracao e que o efeito da funcao setlocale e "por processo". Na documentacao da funcao existe um "warning" explicando que quando existirem varios scripts rodando em diferentes threads no servidor(algo muito comum se seu servidor tem varias requisicoes ao mesmo tempo) uma chamada a setlocale para mudar o locale vai afetar todos os scripts em execucao no momento mesmo que o script em si nao tenha chamado setlocale.Espero que este texto possa ajudar as pessoas pegas de surpresa pelos resultados da funcao iconv. Ate a proxima.Referencias:http://stackoverflow.com/questions/9771886/what-factors-influence-a-successful-iconv-translit-conversion O MySQL tem uma funcao muito legal chamada GROUP_CONCAT. Ela concatena os valores de uma coluna em uma string separados por um separador que por padrao e uma virgula(,). Para exemplificar considere a seguinte estrutura no banco de dados(pode ser usada tanto no MySQL quanto no Postgres):create table countries_languages(country_code varchar(4) not null,language varchar(32) not null,primary key(country_code, language));insert into countries_languages(country_code, language) values('BR', 'Portuguese');insert into countries_languages(country_code, language) values('THA', 'Chinese');insert into countries_languages(country_code, language) values('THA', 'Khmer');insert into countries_languages(country_code, language) values('THA', 'Kuy');insert into countries_languages(country_code, language) values('THA', 'Lao');Ao executarmos a seguinte consulta:select country_code, language as languagesfrom countries_languageswhere country_code = 'THA'Obteremos a seguinte saida: THA Chinese THA Khmer THA Kuy THA Lao Usando o GROUP_CONCAT nesta outra consulta:select country_code, GROUP_CONCAT(language) as languagesfrom countries_languageswhere country_code = 'THA'GROUP BY country_codeA saida sera: THA Chinese,Khmer,Kuy,Lao Certo! Bem legal e util quando quisermos exportar dados ou apresenta-los, mas