PHP: Lendo arquivos com caracteres especiais no nome

Ah as tabelas de caracteres, essa dor de cabeça nos dias de hoje que nos remete a um tempo em que não existe padronização e nem capacidade computacional (época dos processadores 8bits) para algo como UTF8.

Veremos então uma maneira simples de contornar o problema que essa aberração tecnológica nos causa na hora de ler  um arquivo com caracteres especiais no nome utilizando o PHP.

Simples e rápido

1
2
3
4
5
6
7
8
9
10
11
12
<!--?php // Definimos o caminho
$caminho = "/var/www/html/qualquercoisa/arquivo_nome_ççç.pdf";

// O PHP tornará o caminho do arquivo nulo caso tenha algum problema com a codificação do memsmo. Sendo assim vamos checar se a conversão é necessária.

if($caminho == false){
// Casso seja necessário executamos a conversão utilizando essa função maravilhosa
$caminho = iconv(mb_detect_encoding($caminho, "auto"), 'Windows-1252', $caminho);
}
// Depois lemos o conteúdo do arquivo
$conteudoArquivo = readfile($caminho, true);
?-->

Simples, fácil e rápido. A mesma função pode ser utilizada para muitos casos onde é necessário uma conversão mais inteligente, já que esse método trata inclusive aspas e afins.

Porque escolhi utilizar Linux

Versão resumida: meu notebook não roda Crysis e estava difícil conviver com o Windows. Mas vamos abordar isso em uma versão mais longa, com pseudo motivos e sem “freetardices”.

Nesses muitos anos utilizando computadores já passei por muitos sistemas operacionais, começando com o MS-DOS 5/6, Windows do 3.11 em diante e finalmente chegando em diversos sabores de Linux.

A transição da linha de comando do DOS para o Windows 3.11 foi algo incrível, mesmo com as limitações dessa versão que se resumia a um gerenciador de janelas. No 95 a brincadeira começou a ficar séria, finalmente tínhamos um sistema operacional de verdade no Windows, mesmo com o DOS rodando por trás das cortinas. Na sequencia o 98 trouxe estabilidade e maior conectividade, seguido pelo ME, que bem, nem vou comentar.

Chegamos então ao Windows XP, esse que para muitos é o melhor já feito, onde realmente começamos a ter um sistema operacional totalmente independente do DOS (apesar que ele estava lá por motivos de compatibilidade). Por muitos anos me atendia perfeitamente, até o suporte oficial acabar e tornar o sistema inutilizável em uma máquina conectada a internet pela falta de patchs de segurança.

Em novembro de 2006 chega o Windows Vista, aquele que tinha uma cara bonita, porém a um elevado custo no uso de hardware. Sendo assim logo ficou infame e muita gente não migrou. Eu cheguei a usar por algum tempo, mas logo o Windows 7 foi lançado e migrei imediatamente.

Ah, o Windows 7, o melhor já feito até hoje para muitos. Ao menos nos primeiros meses após sua instalação, depois o desempenho começa a incomodar como sempre. Esse eu usei por muito tempo, aliás, ainda utilizo quando preciso fazer algo exclusivo no Windows (Photoshop, estou olhando para você. Eu sei que tem pra Mac, ma não sou retardado de gastar tanto dinheiro em um computador).

Windows 8 e 10 para mim não passaram de teste, pois na época de seu lançamento a minha máquina não era a mais adequada para roda-los e o desempenho deixava a desejar. Nessa época considerei comprar uma notebook novo, afinal o meu já está chegando ao seus 10 de idade.

Foi então que me ocorreu que as novas versões do Windows não traziam nada de novo para mim. Ano após ano apenas coisas dispensáveis e que muitas vezes atrapalhavam meu uso do sistema. Interfaces cheias de frescuras, mil camadas de segurança que não me deixam fazer nada sem clicar em 500 botões de confirmação. No fim percebi que tudo que preciso é ligar meu notebook e ter acesso fácil a um navegador e IDEs de desenvolvimento. E nisso amigos, ninguém me atendeu melhor do que o Linux e sua incrível capacidade de adaptação aos mais diversos tipos de uso através das distribuições.

A transição para mim não foi tão difícil, já que estava costumado com a temíveis linhas de comando no meu dia-a-dia administrando meus servidores. A parte difícil mesmo foi escolher qual distribuição utilizar no desktop entre tantas opções disponíveis.  Passei por Fedora, Ubuntu e Elementary OS (esse por algum tempo), para no fim optar pelo Xubuntu, a versão leve do Ubuntu utilizando o XFCE como gerenciador de janelas.

Mas isso é papo para outro dia, quando explicarei os tipos de distros e recomendarei algumas para cada finalidade.

Utilizando a API JavaScript do Google Maps em seu projeto

Ah, como é bom viver no mundo moderno. Viver em tempos em que temos acesso fácil e de maneira gratuita a ferramentas de geolocalização. Ferramentas essas que até pouco tempo eram coisas de “outro planeta” e inimagináveis no nosso dia-a-dia.

E dentre elas a mais conhecida (e talvez fácil de usar) é a do onipresente Google, a Google Maps API. Essa versátil API vem em diversas sabores, porém hoje iremos tratar de sua versão em JavaScript voltada a páginas na web.

Nota: No modo gratuito o número de requisições da API JavaScript do Google Maps é limitado em 2500 por dia. (Mas não se preocupe, atualmente o Google oferece um ano gratuito do plano “premium” e mais 300 dólares de bônus para gastar no seu eco-sistema de cloud computing, do qual a API faz parte.)

Mas vamos ao que interessa, o código simples e bem explicado.

Mas primeiro…

Antes de botarmos a mão na massa será necessário realizar o cadastro gratuito no Google Cloud Plataform para obtenção da chave de acesso da API JavaScript do Google Maps. O cadastros é rápido e fácil de fazer. Só tome cuidado para gerar a chave de API para a versão JavaScript!

Obtendo a geolocalização do usuário via HTML5

O HTML5 é a maneira mais fácil de ser obter a geolocalização do usuário, além de ser compatível com todos os navegadores em suas versões mais recentes.

O único ponto negativo é que, devido a questões de privacidade, será exibido um popup para que o usuário aceite compartilhar sua localização com a página.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function obterLocalizacao(){
// Verifica se é possível obter a geolocalização do usuário.
if ( navigator.geolocation ){
navigator.geolocation.getCurrentPosition(

// Em caso de sucesso salva as informações de Latitude e Longitude nos input especificos.
function( posicao ){
jQuery("#geoLatitude").val(posicao.coords.latitude);
jQuery("#geoLongitude").val(posicao.coords.longitude);
},

// Em caso de erro faz o tratamento
function ( erro ){
var geoError = 'Erro: ';
switch( erro.code ) {
case erro.PERMISSION_DENIED:
geoError += 'Usuário não autorizou acesso a geolocalização.';
break;
case erro.POSITION_UNAVAILABLE:
geoError += 'Localização indisponível.';
break;
case erro.TIMEOUT:
geoError += 'Tempo limite expirado.';
break;
case erro.UNKNOWN_ERROR:
geoError += 'Algo deu errado!';
break;
}
console.log( erroDescricao )

jQuery("#geoError").val(geoError);

}
);
}
}

// Chama a função quando a página é carregada, mas pode ser utilizada com outros "gatilhos" como "click".
jQuery(document).ready(function() {
obterLocalizacao();
});

Agora que você já tem os dados nos “inputs” fica fácil de salva-los da forma que achar mais apropriada.

Carregando a API JavaScript do Google Maps

Aqui não tem muito segredo, mas não se esqueça de colocar a chave de API que criamos.

1
<script async defer src="https://maps.googleapis.com/maps/api/js?key=SUA_CHAVE_DA_API&callback=initMap"></script>

Exibindo os dados de geolocalização no mapa

O último passo é a exibição dos dados de latitude e longitude no Google Maps dentro de nosso site.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function initMap() {

// Define uma variavel com a longitude e latitude
var geoLatLng = {lat: AQUI_VAI_A_LATITUDE, lng: AQUI_VAI_A_LONGITUDE};

// Cria o obejto do mapa e informa o container onde será inserido: #geoMapa
var map = new google.maps.Map(document.getElementById('geoMapa'), {
center: geoLatLng,
zoom: 17
});

// Adiciona um ponto no mapa
var marker = new google.maps.Marker({
position: geoLatLng,
map: map,
title: 'Legenda do seu ponto no mapa.'
});

// Atualiza o mapa com as informações customizadas
var infoWindow = new google.maps.InfoWindow({map: map});
}

Essa função ser executada automaticamente pelo callback do carregamento da API que fizemos no passo anterior.

E chegamos ao fim

Agora que você sabe como capturar a localização e exibi-la no mapa basta adaptar o código para suas necessidades. É possível por exemplo carregar o mapa apenas quando o usuário clickar em um botão, para isso basta remover o callback na chamada da API e executar a função “initMap()” no evento “onClick”.

Abrindo a bodega

Desenvolvedor, programador, engenheiro de software, analista de sistemas ou do que diabos você quiser me chamar. O titulo afinal não importa, pois somos todos poetas do código, compositores trabalhando com ciclos de CPU para produzir uma sinfonia afinada de bits. (Isso ficou bonito demais, acho até que devo ter plagiado inconscientemente de algum lugar)

Natural de Itapiranga nos cafundós de Santa Catarina, radicado em Brasília desde 2014(eu sei, você ficou com vontade de falar que aqui só tem ladrão) e tendo sobrevivido por 14 anos em Joinville (terra do tricolor dos tricolores, aquele que nasceu campeão) . Sou casado, pai e blá blá blá.

Levo o a profissão, principalmente no que diz respeito a escrever código, como uma piada, sempre tentando rir das situações. Porque de seriedade já bastam os compiladores com suas regras e erros surreais (maldito erro na linha 764 de um código que só tem 300 linhas).

Atualmente terceirizo serviços para uma empresa de forma quase integral, aliás, esses foi o motivo de eu ter abandonado a terra da chuva rumo a terra dos ladrões de colarinho branco.

Sendo assim abri essa bodega para compartilhar um pouco de conhecimento de forma descontraída e tentando simplificar tudo ao máximo. Se eu consegui? Não sei.

Enfim, sinta-se a vontade, pegue uma cerveja na geladeira, sente no sofá e aprecie essa zona.

Ah! Meu nome? É Francis Schonarth, mas pode ignorar o primeiro nome que meu pai teve o mau gosto de me dar.

(Esse texto vai para a página “sobre” do blog também, mas não faz diferença já que ninguém clica lá)