domingo, 27 de abril de 2008

Codificação de Strings para programação Web

A coisa mais importante para localizar seu site ASP.NET para a língua portuguesa é usar a seguinte linha no seu Web.Config:
<globalization uiculture="pt-BR" culture="pt-BR" fileencoding="iso-8859-1" responseencoding="utf-8" requestencoding="utf-8">
Para a passagem de parâmetros via QueryString, na língua portuguesa sempre há o problema de caracteres acentuados e a cedilha. Para contornar este problema os browsers sempre codificam os caracteres acentuados, de uma das seguintes formas:
  1. escape(), ex: @ vira %7E
  2. encodeURI(), ex: % vira %25
  3. encodeURIComponent(), ex: @ vira %40
Eu recomendo que quando enviar o parâmetro via URL utilize sempre EncodeURIComponent(). Se fizer assim o ASP.NET decodifica implicitamente ao receber os parâmetros com o comando:
Request.Params["nomedoparâmetro"];
Mas se o parâmetro não tiver sido codificado explicitamente, ele será codificado de forma que não será possível decodificar com nenhum dos métodos abaixo:
  1. Microsoft.JScript.GlobalObject.unescape(), complementada por escape()
  2. Microsoft.JScript.GlobalObject.decodeURI(), complementada por encodeURI()
  3. Microsoft.JScript.GlobalObject.decodeURIComponent(), complementada por encodeURIComponent()
  4. Server.UrlDecode(), complementada por Server.UrlEncode()
Nota: Para usar o Microsoft.JScript no MS Visual Studio, você precisa adicionar a referência manualmente (Add Reference).

Já no JavaScript (e também no JScript) existem
escape(), encodeURI() e encodeURIComponent() e as funções inversas.

Quando a meta tag de codificação iso-8859-1 não está presente no header do documento HTML, faz-se necessário utilizar a codificação HTML, também chamados de entity escape characters. Para realizar a conversão você pode fazer manualmente com ajuda desta tabela, ou utilizar as seguintes funções:

ASP.NET
  1. Server.HtmlDecode()
  2. Server.HtmlEncode()
No JS você precisará da biblioteca PrototypeJS para chamar as seguintes funções:
  1. escapeHTML()
  2. unescapeHTML()
A seguir listo o código destas funções para você não ter que incluir toda a biblioteca só para usar estas funções:

function escapeHTML() {
var self = arguments.callee;
self.text.data = this;
return self.div.innerHTML;
}

function unescapeHTML() {
var div = new Element('div');
div.innerHTML = this.stripTags();
return div.childNodes[0] ? (div.childNodes.length > 1 ?
$A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
div.childNodes[0].nodeValue) : '';
}

function $A(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
var length = iterable.length, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;
}

Um comentário:

Anônimo disse...

opah amigo,

parabéns pelo blog...uauuhauh

falows