<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ataraxia! &#187; bd</title>
	<atom:link href="http://www.ataraxia.com.br/posts/tag/bd/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ataraxia.com.br</link>
	<description>O estado da arte em TI</description>
	<lastBuildDate>Sun, 17 Jul 2011 21:36:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Otimização de sites com memcached</title>
		<link>http://www.ataraxia.com.br/posts/otimizacao-de-sites-com-memcached</link>
		<comments>http://www.ataraxia.com.br/posts/otimizacao-de-sites-com-memcached#comments</comments>
		<pubDate>Sat, 16 May 2009 16:01:32 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[bd]]></category>
		<category><![CDATA[memoria]]></category>
		<category><![CDATA[otimização]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=328</guid>
		<description><![CDATA[Um projeto muito interessante, e que pode ser usado pra aumentar drasticamente o desempenho de aplicativos web é o Memcached. Pela descrição do site do projeto, o &#8220;memcached é um sistema distribuído de alto desempenho para o cacheamento de objetos na memória, genérico por natureza, mas feito para se aumentar a velocidade de sites dinâmicos [...]]]></description>
			<content:encoded><![CDATA[<p>Um projeto muito interessante, e que pode ser usado pra aumentar drasticamente o desempenho de aplicativos web é o <a href="http://www.danga.com/memcached/">Memcached</a>. Pela descrição do site do projeto, o &#8220;memcached é um sistema distribuído de alto desempenho para o <i>cacheamento</i> de objetos na memória, genérico por natureza, mas feito para se aumentar a velocidade de sites dinâmicos diminuindo a carga no banco de dados&#8221;.<br />
O memcached funciona como um grande dicionário, que armazena tuplas do tipo [chave, valor]. Para armazenar um objeto qualquer, basta conectar no memcached e passar uma chave para acessá-lo e o objeto (e opcionalmente outros parâmetros, como tempo de armazenamento). Para buscar o objeto, basta conectar ao memcached e pedir a ele o objeto que possui a chave previamente criada.<br />
Digamos que uma página web precise fazer algumas consultas pesadas em um banco de dados. A idéia é justamente pegar o resultado da consulta e jogar pra dentro do memcached. Na próxima vez que a consulta precisar ser feita, o programa irá primeiro checar se o resultado já está disponível no memcached. Se estiver, ótimo, economizamos uma query pesada. Se não estiver, o programa faz a consulta e guarda o resultado no memcached. Simples assim!</p>
<h2>Exemplo em PHP</h2>
<p>O memcached pode ser acessado de muitas linguagens de alto nível, como C/C++, Java, Python, PHP, e até .NET. Abaixo, um exemplo em PHP.<br />
Antes do memcache, uma página poderia ter uma consulta do seguinte tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// A query SQL está abreviada, apenas como exemplo</span>
<span style="color: #666666; font-style: italic;">// Digamos que essa consulte demore cerca de 1 segundo</span>
<span style="color: #666666; font-style: italic;">// para ser completada</span>
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM tabela INNER JOIN ......&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$res</span> <span style="color: #339933;">=</span> <span style="color: #990000;">pg_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">pg_fetch_all</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$res</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// array com todos os resultados</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Com esse código, a cada acesso na página, teremos uma consulta de 1 segundo feita ao banco de dados. Muitas vezes, a consulta será exatamente a mesma. Modificando a consulta para uso do memcached, teríamos algo assim:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// Conecta ao memcached</span>
<span style="color: #000088;">$mc</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Memcache<span style="color: #339933;">;</span>
<span style="color: #000088;">$mc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addServer</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ip.do.servidor'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM tabela INNER JOIN ......&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cache</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Usamos o md5() da query como chave</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Resultado não está no cache</span>
    <span style="color: #000088;">$res</span> <span style="color: #339933;">=</span> <span style="color: #990000;">pg_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">pg_fetch_all</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$res</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$mc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cache</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Pelo exemplo acima, temos algumas modificações. Primeiramente conectamos ao memcached. A chamada a addServer() pode ser feita múltiplas vezes, caso existam vários memcached rodando em máquinas separadas. Pode ser dado um &#8220;peso&#8221; pra cada servidor também, de acordo com a memória disponível em cada um.<br />
Logo em seguida, é feita a verificação no memcached se o resultado da consulta já está lá. Como chave, usei o hash md5 da consulta, pra gerar uma identificação única. O método get() pode retornar false, caso a chave não esteja no memcached, ou retornar o objeto que foi guardado.<br />
A checagem é simples. Se o get() retornou false, então o sistema faz a consulta como já fazia antes, e no fim guarda o resultado no memcached, pra agilizar as próximas consultas. E caso não tenha retornado false, temos já o resultado da consulta diretamente. Ao fim do bloco <i>if</i>, teremos, de uma forma ou de outra, o resultado da consulta em $arr.<br />
A diferença é que rodando a consulta no banco, o tempo será de cerca de 1 segundo (tempo que estimamos para a execução da consulta), e pegando o resultado direto do memcached, a consulta demorará algo da ordem de milissegundos para ser completada.</p>
<h2>Problemas</h2>
<p>Um dos problemas clássicos em qualquer abordagem que use cache é como saber se as informações em cache ainda estão atuais. Com o memcached, isso não é diferente. Existem algumas formas de se lidar com o problema.<br />
A primeira delas, mais simples, e que pode ser usada livremente caso não seja de suma importância que os dados estejam atuais, é mexer no tempo em que a informação ficará no cache. O tempo pode ser especificado na chamada ao método set(), da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$mc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arr</span><span style="color: #339933;">,</span> MEMCACHE_COMPRESSED<span style="color: #339933;">,</span> <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Temos neste exemplo todos os parâmetros para a chamada de set(): a chave, o objeto a ser guardado, uma flag (pode ser usado MEMCACHE_COMPRESSED, que indica que o objeto será comprimido para ocupar menos espaço, ou 0 pra indicar que deve ser guardado sem compressão), e por último o tempo de vida do objeto, no caso, 60 segundos.<br />
Ou seja, caso não haja problema das informações permanecerem desatualizadas por 60 segundos no máximo, essa abordagem pode ser usada.<br />
Caso a informação tenha que estar sempre atualizada, a forma de tratamento terá que ser outra. O memcached possui método para apagar o objeto associado a uma chave. Tendo a chave, basta usar:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$mc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'chave'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>e a entrada que existia no memcached para aquela chave será invalidada.<br />
A idéia, nesse segundo caso, é justamente localizar no código todos os pontos que modificam o banco de dados de forma que possa alterar o resultado da consulta feita, e adicionar código para invalidar o cache nesses pontos. Assim, quando for feita a consulta no memcached, caso alguma informação tenha sido modificada, a entrada correspondente no memcached já terá sido apagada, e a chamada a get() retornará false naturalmente.<br />
É claro que essa segunda abordagem dá muito mais trabalho, por isso a sugestão de se usar a primeira delas nos casos em que pode ser usada. Lembre-se que em um site com 100 acessos por segundo, um tempo de vida de 60 segundos evitará 5999 consultas ao banco (a primeira será feita e guardada).</p>
<h2>Mais informações</h2>
<p>O site do projeto tem <a href="http://code.google.com/p/memcached/wiki/Start">um Wiki</a> que responde a maior parte das dúvidas que se pode ter, em relação a instalação e ao uso.<br />
No caso do PHP, as funções são bem documentadas na <a href="http://br.php.net/manual/en/book.memcache.php">parte do manual sobre memcache</a>.<br />
Eu uso em produção o memcached, com 2 servidores, um com 768mb de memória disponíveis para o memcached e outro com 256mb. Dei pesos 3 e 1 respectivamente, para que um objeto tenha 3 vezes mais chance de cair no primeiro servidor. A configuração está bastante satisfatória, e o banco de dados agradece.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-imagens-inline" title="Otimização: imagens inline">Otimização: imagens inline</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-3-cache" title="Otimização de sites, parte 3 &#8211; Cache">Otimização de sites, parte 3 &#8211; Cache</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-parte-2-compressao" title="Otimização de sites, parte 2 &#8211; Compressão">Otimização de sites, parte 2 &#8211; Compressão</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/problemas-com-acentuacao" title="Problemas com acentuação?">Problemas com acentuação?</a></li><li><a href="http://www.ataraxia.com.br/posts/o-limite-de-4-ou-3-gb-de-memoria" title="O limite de 4 (ou 3?) Gb de memória">O limite de 4 (ou 3?) Gb de memória</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/otimizacao-de-sites-com-memcached/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Problemas com acentuação?</title>
		<link>http://www.ataraxia.com.br/posts/problemas-com-acentuacao</link>
		<comments>http://www.ataraxia.com.br/posts/problemas-com-acentuacao#comments</comments>
		<pubDate>Mon, 05 Jan 2009 00:20:34 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[bd]]></category>
		<category><![CDATA[charset]]></category>

		<guid isPermaLink="false">http://blog.ataraxia.com.br/?p=150</guid>
		<description><![CDATA[Hoje em dia, é incrível como ainda temos pessoas tendo problemas com acentuação, e ainda pior, ao invés de se resolver o problema da forma correta, inventam várias gambiarras pra &#8220;deixar funcionando&#8221;, mesmo que não seja da forma certa. Antes de mostrar os problemas que são normalmente encontrados, um pouco de história pra descobrirmos porque [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia, é incrível como ainda temos pessoas tendo problemas com acentuação, e ainda pior, ao invés de se resolver o problema da forma correta, inventam várias gambiarras pra &#8220;deixar funcionando&#8221;, mesmo que não seja da forma certa.</p>
<p>Antes de mostrar os problemas que são normalmente encontrados, um pouco de história pra descobrirmos porque existem várias codificações, e que elas não estão aí só pra atrapalhar a nossa vida.</p>
<h4>A muito, muito tempo atrás&#8230;</h4>
<p>Todos sabemos que os computadores manipulam bits, e que para facilitar a nossa vida, os agrupam em bytes, que são conjuntos de 8 bits. Como cada bit pode valer 0 ou 1, temos, para um byte, 256 combinações diferentes. Logo, 1 byte tem a capacidade de armazenar um número de 0 a 255.</p>
<p>Como os computadores no passado operavam na língua inglesa, foi adotado o padrão <acronym title="American Standard Code for Information Exchange">ASCII</acronym> (lê-se <em>ásqui</em>). Este padrão de codificação define 128 caracteres, sendo alguns de controle e outros tantos para codificar letras, números e alguns sinais.</p>
<p>Como só são necessários 128 valores para representar toda a gama de caracteres pela codificação ASCII, ficamos com a metade da capacidade de armazenamento do nosso byte sem uso. Chamamos este formato de codificação também de 7-bit, pois precisamos de apenas 7 bits para codificar 128 valores.</p>
<h4>Entram em cena as extensões</h4>
<p>Conforme foi sendo necessário se colocar caracteres e símbolos extras, como por exemplo, letras gregas e caracteres internacionais (cê-cedilha, a-com-til, etc), resolveu-se o problema da forma mais simples possível.</p>
<p>Como temos a metade do byte inutilizada, porque não usar estes 128 valores que estão &#8220;sobrando&#8221; para armazenar outros caracteres? Pois foi exatamente isto que foi feito. Definiram símbolos que seriam adicionados neste espaço, e nasceram as &#8220;tabelas ascii estendidas&#8221;, ou seja, são completamente compatíveis com o padrão ASCII (pois os primeiros 128 valores não mudam).</p>
<p>O grande problema desta solução está no fato de que no mundo inteiro, existem muito mais que 128 caracteres e símbolos. Daí, cada região passou a trabalhar com sua própria tabela ASCII estendida. No ocidente, se usa a codificação ISO8859-1, que possui caracteres latinos, letras gregas. É usado em boa parte do mundo (Americas, Oceania, Europa ocidental e boa parte da Africa).</p>
<p>Outras regiões usam outras codificações, como por exemplo o KOI8-R, usado na Rússia. Esta codificação possui todo o alfabeto cirílico, utilizado naquela região.</p>
<h4>Uma tremenda confusão</h4>
<p>Com dezenas de codificações, muitos problemas passaram a ocorrer. Se tentar ler um documento codificado em ISO8859-1 usando outra tabela ASCII estendida que não seja a ISO8859-1, qualquer caractere que esteja na área estendida da tabela (acima dos 128 primeiros caracteres) irá aparecer trocado por outro. E como o computador não tem como saber qual é a codificação correta de um documento sem analisá-lo semanticamente (temos apenas uma grande seqüência de valores de 0 a 255), temos um grande problema formado.</p>
<p>Outro problema sério é a impossibilidade de se exibir um documento com caracteres de várias línguas diferentes, sem implementar algum tipo de gambiarra.</p>
<h4>Unicode: seus problemas acabaram!</h4>
<p>No meio disso tudo, nasce o Unicode, para resolver de vez todos os problemas relacionados a codificação de caracteres. A idéia é simples: ao invés de usar apenas 1 byte pra armazenar todos os caracteres, símbolos, figuras, etc (o que é logicamente impossível), porque não utilizar mais de 1 byte?</p>
<p>A codificação UTF-8 armazena caracteres em seqüências que variam de 1 a 4 bytes, mas mantendo a compatibilidade com o ASCII. Os primeiros 128 valores são idênticos.</p>
<p>Com o Unicode, surgem outros problemas que não irei discutir aqui, como por exemplo, um texto com 20 caracteres não irá ocupar necessariamente 20 bytes, e isto causa problemas de armazenamento em buffers, em disco, em estruturas de dados. Tudo deve estar preparado para receber possivelmente mais que os 20 bytes.</p>
<p>O fato é: Unicode é uma codificação universal, que comporta qualquer caractere existente até o momento (pelo menos até explorarmos o espaço e nos depararmos com algumas raças alienígenas).</p>
<h4>De volta ao presente</h4>
<p><strong>Todos</strong> os problemas relacionados a acentuação hoje em dia decorrem de um erro simples: mistura de codificações. Simples assim.</p>
<p>Se é desejado um sistema completamente em UTF-8, então, todos os seus componentes devem estar operando em UTF-8. No caso de páginas web, os arquivos gerados devem estar em UTF-8, os bancos de dados devem estar preferencialmente em UTF-8, a conexão com os bancos de dados devem estar em UTF-8, e o servidor web deve informar ao navegador de que a página que ele está exibindo é UTF-8. Vou continuar usando o UTF-8 como exemplo, mas tudo isto vale para qualquer outra codificação. É só trocar onde estiver UTF-8 pela codificação que desejar.</p>
<h4>As páginas</h4>
<p>Os arquivos com o código HTML, ou o que quer que esteja sendo gerado, precisa estar codificado em UTF-8. Se ele não estiver, aparecerão caracteres esquisitos na tela, pois o navegador vai tentar ler a página como UTF-8, e o que vai estar lá não vai ser UTF-8. Acentos e símbolos extras vão ficar truncados.</p>
<p>Gambiarras surgem aqui. Ao invés de se resolver este problema da forma correta (mudando-se a codificação das páginas), muita gente prefere &#8220;dar um jeito&#8221;. Daí, temos no código chamadas para conversão de codificações, temos tradução de acentos em entidades html (ao invés de se colocar um &#8220;Ç&#8221;, coloca-se &#8220;&amp;Ccedil;&#8221;). Claro que existem usos válidos para isto, mas o que mais vejo por aí é o uso disso para se contornar o problema e evitar a solução correta.</p>
<h4>Banco de dados</h4>
<p>Os bancos de dados deveriam preferencialmente estar em UTF-8, mas outras codificações também são possíveis. Isto acontece porque uma conexão feita com o banco pode operar em uma codificação, independente da forma como o banco guarda os dados internamente.</p>
<p>Explico: mesmo o banco de dados guardando tudo como ASCII internamente, se a conexão com o banco é feita em UTF-8, o banco &#8220;sabe&#8221; que precisa converter todos os dados antes de apresentá-los para a aplicação que os solicitou. O importante, no caso, é que a conexão seja efetuada com a codificação correta.</p>
<h4>Cabeçalhos HTTP: importantíssimos!</h4>
<p>E por último, de nada adianta tudo estar operando em UTF-8, e o servidor web dizer ao navegador: &#8220;aí, a página que vou te mostrar agora tá em ISO8859-1, ok?&#8221;. Daí o navegador tenta ler a página como ISO8859-1, e o resultado são vários caracteres duplos onde deveríamos ver acentos.</p>
<p>A forma correta de se fazer isto, é fazer com que o servidor envie o cabeçalho <em>Content-type</em> de forma correta, informando o tipo <acronym title="Multipurpose Internet Mail Extensions">MIME</acronym> do dado que está sendo servido, assim como a codificação utilizada.</p>
<p>Por exemplo, para páginas HTML, o servidor poderia enviar o seguinte cabeçalho:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">Content-type: text/html; charset=utf-8</pre></div></div>

<p>Uma gambiarra que se usa muito neste ponto é colocar o seguinte código no HTML:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>Esta forma, embora funcione em alguns casos, deve ser evitada, pois o navegador só irá considerá-la se o servidor web não informar a codificação e se o navegador não tiver alguma preferência marcada. Ou seja, depende de fatores externos, e nem sempre será honrada.</p>
<h4>Conclusão</h4>
<p>Eu, pessoalmente, uso UTF-8 para tudo. Acho que já passou da hora desta codificação ser adotada por todos. Não vejo motivo hoje em dia para se continuar usando o obsoleto ISO8859-1 (também conhecido como &#8220;Latin-1&#8243;) ou outras codificações, visto que o UTF-8 engloba todas elas.</p>
<p>Tudo isto é independente da linguagem utilizada. No caso, citei a web porque é um campo onde tenho muita familiaridade, mas se aplica em qualquer situação.</p>
<p>E se a experiência contar, depois do dia que passei a usar UTF-8 para tudo, nunca mais tive problemas com acentuação. Só me restam as lembranças deste passado sombrio.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-com-memcached" title="Otimização de sites com memcached">Otimização de sites com memcached</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/problemas-com-acentuacao/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

