<?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>Indalcasa &#187; vb.net</title>
	<atom:link href="http://www.indalcasa.com/tag/vbnet/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.indalcasa.com</link>
	<description>Un blog de tecnologia</description>
	<lastBuildDate>Tue, 03 Jan 2012 15:14:37 +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>Deploy de ASP.Net MVC en Apache con mod_mono</title>
		<link>http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/</link>
		<comments>http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 12:34:10 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=792</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Lo que voy a escribir aquí no es una guía de como instalar Mono ASP.Net con MVC sobre apache con mod_mono, aunque la escribiré, sino como hacer el deploy de una aplicación. Cuando montamos un sistema Mono ASP.Net con MVC sobre apache con mod_mono, hay que tener 3 cosas en cuenta para su correcto funcionamiento, son [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Lo que voy a escribir aquí no es una <strong>guía de como instalar Mono ASP.Net con MVC sobre apache con mod_mono</strong>, aunque la escribiré, sino como hacer el <strong>deploy de una aplicación</strong>. Cuando montamos un <strong>sistema Mono ASP.Net con MVC sobre apache con mod_mono</strong>, hay que tener 3 cosas en cuenta para su correcto funcionamiento, son pequeños detalles pero que te pueden dar algún que otro quebradero de cabeza. Las 3 cosas a tener en cuenta son:</p>
<ul>
<li><strong>Apache no entiende que tu app es MVC</strong>, por lo que hay que decirselo.</li>
<li><strong>Apache ni mod_mono son capaces de dictaminar tu index</strong></li>
<li>Siempre hay que tener algo para <strong>recompilar el backend en caso de cacheo o fallo</strong> (generalmente cuando desarrollamos).</li>
</ul>
<p>Bueno, expliquemos cada una, en primer lugar apache no sabe que tu <strong>app es un MVC de ASP.Net</strong>, por lo que cuando hagamos un <strong>deploy</strong> o creemos un proyecto nuevo de <strong>Mono ASP.Net con MVC</strong>, lo primero a crear es un <strong>.htaccess</strong> forzando a que es un <strong>MVC</strong>. El <strong>código del htaccess</strong> es:</p>
<pre class="brush: text; gutter: true">ForceType application/x-asp-net</pre>
<p>Con esto ya  podemos poner a funcionar nuestra <strong>aplicación web</strong>. El siguiente paso para hacer las cosas bien, sería <strong>crear un index</strong>, ¿Por qué? ¿Acaso no saben cual es mi <strong>index</strong>? Pues no, todas las pruebas, tanto en <strong>Linux</strong> como en <strong>Mac OS X</strong>, es que <strong>mod_mono</strong> no es capaz de entender cual es el <strong>index</strong> que definimos en el <strong>global.asax</strong>, por lo que lo mejor es crear un <strong>index.aspx</strong> que cargue nuestro <strong>HomeController</strong>, o el que queramos. El <strong>index</strong> estaría en el raiz del proyecto y su código sería:</p>
<pre class="brush: csharp; gutter: true">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt;
&lt;%
   this.Context.RewritePath(&quot;Home&quot;, false);

   IHttpHandler httpHandler = new MvcHttpHandler();
   httpHandler.ProcessRequest(this.Context);
%&gt;</pre>
<p>Lo que hacemos con este <strong>index.aspx</strong> es decirle que cuando cargue la <strong>home</strong> (el <strong>index</strong>) cargue automáticamente el <strong>HomeController</strong>. Ahora solo nos falta crear un sistema de <strong>reseteo de backend</strong> por si se queda en <strong>cache</strong> y queremos cambiar algo. Para ello creamos una carpeta, por ejemplo, <strong>reset-mono-backend</strong> y creamos un <strong>.htaccess</strong> dentro de esa carpeta. Cabe decir que al htaccess lo podemos otorgar de un sistema de <strong>autentificación</strong> y cosas por el estilo para acceder, pero como esto es un ejemplo, será lo más básico. El <strong>contenido del .htaccess</strong> será:</p>
<pre class="brush: text; gutter: true">ForceType None
SetHandler mono-ctrl</pre>
<p>Al entrar en /nuestroproyecto/reset-mono-backend, nos aparecerá una <strong>interfaz</strong> que nos permitirá entre otras cosas, <strong>resetear el backend</strong>. Otro día explicaré como se instala el sistema en si.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState</title>
		<link>http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/</link>
		<comments>http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 08:04:59 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=766</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>En .Net, bien sea en C# o en VB.Net, hay un tipo de clases llamadas controladores genéricos que nos proveen de un nivel muy básico de controlador web. En ASP.Net, los handlers o  HttpHandler son un tipo de clases tan básicas, que no implementan entre otras cosas, las sesiones, por lo que tendremos que indicar [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>En <strong>.Net</strong>, bien sea en <strong>C#</strong> o en <strong>VB.Net</strong>, hay un tipo de clases llamadas <strong>controladores genéricos</strong> que nos proveen de un <strong>nivel muy básico de controlador web</strong>. En <strong>ASP.Net</strong>, los <strong>handlers</strong> o  <strong>HttpHandler</strong> son un tipo de clases tan básicas, que no implementan entre otras cosas, las <strong>sesiones</strong>, por lo que tendremos que indicar explícitamente en la clase que tipo de <strong>sesión vamos a implementar</strong>.</p>
<p>Me voy a centrar en explicar 3 casos que son los más comunes, a la hora de <strong>implementar un handler</strong>:</p>
<ul>
<li><strong>Sin sesión</strong>: para esto no hay que hacer nada, con la declaración por defecto nos es suficiente. <strong>No tendremos acceso a la sesión</strong>, que sera nula si hacemos un <strong>context.Session</strong></li>
<li><strong>Sesión de solo lectura</strong>: para esto debemos <strong>implementar la interfaz IReadOnlySessionState</strong>, de tal modo que al hacer <strong>context.Session</strong>, tenga los <strong>valores de la sesión</strong>, pero no podremos añadir o actualizar datos sobre la <strong>sesión</strong>.</li>
<li><strong>Sesión de lectura y escritura</strong>: para esto debemos <strong>implementar la interfaz IRequiresSessionState</strong>, que nos permitirá acceder a los <strong>datos de la sesión</strong>, así como añadir y actualizar los datos.</li>
</ul>
<div>A continuación dejo unos ejemplos en C# y en VB.Net para que os hagais una idea.</div>
<pre class="brush: csharp; title: Ejemplo de implementación de handlers en C#; notranslate">
//Este ejemplo devolverá un error ya que context.Session es Nothing
public class IndalcasaSessionHandler : System.Web.IHttpHandler {
    public void ProcessRequest(HttpContext context) {
        Object value;

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;);
		value = context.Session.Item(&quot;value&quot;);

		context.Response.Write(value);
    }
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//pero value tendrá el valor original que tuviera y no el valor &quot;nuevo valor&quot;
//ya que no se puede escribir en la sesión
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState {
    public void ProcessRequest(HttpContext context) {
        Object value;

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;);
		value = context.Session.Item(&quot;value&quot;);

		context.Response.Write(value);
    }
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//y actualizará el valor de la sesión correctamente
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState {
    public void ProcessRequest(HttpContext context) {
        Object value;

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;);
		value = context.Session.Item(&quot;value&quot;);

		context.Response.Write(value);
    }
}
</pre>
<pre class="brush: vb; title: Ejemplo de implementación de handlers en VB.Net; notranslate">
'Este ejemplo devolverá un error ya que context.Session es Nothing
Public Class IndalcasaSessionHandler
    Implements System.Web.IHttpHandler

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim value As Object

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;)
		value = context.Session.Item(&quot;value&quot;)

		context.Response.Write(value)
    End Sub
End Class

'Este ejemplo no devolverá un error ya que context.Session no es Nothing
'pero value tendrá el valor original que tuviera y no el valor &quot;nuevo valor&quot;
'ya que no se puede escribir en la sesión
Public Class IndalcasaSessionHandler
    Implements System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim value As Object

		context.Session.Add(&quot;value&quot;, &quot;nuevo valor&quot;)
		value = context.Session.Item(&quot;value&quot;)

		context.Response.Write(value)
    End Sub
End Class

'Este ejemplo no devolverá un error ya que context.Session no es Nothing
'y actualizará el valor de la sesión correctamente
Public Class IndalcasaSessionHandler
    Implements System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim value As Object

		context.Session.Add(&quot;value&quot;, &quot;nuevo valor&quot;)
		value = context.Session.Item(&quot;value&quot;)

		context.Response.Write(value)
    End Sub
End Class
</pre>
<p>Espero que os saque de un apuro en el que alguna vez me he visto metido por no recordar las <strong>interfaces que hay que implementar para poder leer y/o escribir en la sesión en un controlador genérico de ASP.Net</strong>.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Double.Parse y Decimal.Parse con símbolos de putuación</title>
		<link>http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/</link>
		<comments>http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 09:02:18 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=758</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Un problema que me encuentro a menudo en .Net por igual en Visual Basic o en C#, es cuando tengo que parsear un decimal o un double desde un string. Muchas veces, cuando parseas un double o un decimal, encontramos un error ya que en operaciones matemáticas, el símbolo de puntuación para la parte decimal [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Un problema que me encuentro a menudo en <strong>.Net</strong> por igual en <strong>Visual Basic</strong> o en <strong>C#</strong>, es cuando tengo que <strong>parsear un decimal o un double desde un string</strong>. Muchas veces, cuando <strong>parseas un double o un decimal</strong>, encontramos un error ya que en <strong>operaciones matemáticas</strong>, el <strong>símbolo de puntuación para la parte decimal es el punto</strong>, por lo que al hacer un <strong>Double.Parse(number)</strong> o un <strong>Decimal.Parse(number)</strong>, lo que hace es ignorar el punto y por tanto tomar la <strong>parte decimal</strong> como si fuera <strong>parte entera</strong>. Para que esto no nos pase, tenemos que indicar que el <strong>sistema numérico utilizado es el matemático</strong>, aquel que no varia con la <strong>cultura</strong>. Con un ejemplo se verá mas claro.</p>
<p>Un ejemplo en <strong>C#</strong>:</p>
<pre class="brush: csharp; title: Ejemplo en C#; notranslate">
string number = &quot;15.3&quot;;
double doNumber;
decimal deNumber;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

/*
Los valores son:
doNumber = 153
deNumber = 153
*/

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

/*
Los valores son:
doNumber = 15.3
deNumber = 15.3
*/
</pre>
<p>Un ejemplo en <strong>VB.Net</strong></p>
<pre class="brush: vb; title: Ejemplo en VB.Net; notranslate">
Dim number As String = &quot;15.3&quot;;
Dim doNumber As Double;
Dim deNumber As Decimal;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

'Los valores son:
'doNumber = 153
'deNumber = 153

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

'Los valores son:
'doNumber = 15.3
'deNumber = 15.3
</pre>
<p><strong>CultureInfo</strong> es una clase que provee de información de las culturas y en concreto, la propiedad <strong>InvariantCulture</strong> o <strong>CultureInfo.InvariantCulture</strong>, es quien provee la información de la cultura que no varia por localizaciones, vease el <strong>simbolo de puntuación matemático</strong>. La clase <strong>CultureInfo</strong> se encuentra en el namespace <strong>System.Globalization</strong>, quedado la ruta así: <strong>System.Globalization.CultureInfo.InvariantCulture</strong>.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Descodificar Quoted Printable para leer correos de GMail en Visual Basic</title>
		<link>http://www.indalcasa.com/programacion/visual-basic-net/descodificar-quoted-printable-para-leer-correos-de-gmail-en-visual-basic/</link>
		<comments>http://www.indalcasa.com/programacion/visual-basic-net/descodificar-quoted-printable-para-leer-correos-de-gmail-en-visual-basic/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 23:03:40 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[GMail]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=553</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/visual-basic-net/descodificar-quoted-printable-para-leer-correos-de-gmail-en-visual-basic/' addthis:title='Descodificar Quoted Printable para leer correos de GMail en Visual Basic ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Un amigo esta realizando un proyecto en Visual Basic .Net, que entre otras cosas se conecta a GMail para recibir correos e introducirlos en una base de datos para mostrarlos en un panel de administración. Hasta aquí todo normal, el problema viene cuando en los correos utiliza caracteres, que vamos a llamar extraños, como tildes [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/visual-basic-net/descodificar-quoted-printable-para-leer-correos-de-gmail-en-visual-basic/' addthis:title='Descodificar Quoted Printable para leer correos de GMail en Visual Basic ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/visual-basic-net/descodificar-quoted-printable-para-leer-correos-de-gmail-en-visual-basic/' addthis:title='Descodificar Quoted Printable para leer correos de GMail en Visual Basic ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Un amigo esta realizando un proyecto en <strong>Visual Basic .Net</strong>, que entre otras cosas se conecta a <strong>GMail</strong> para recibir correos e introducirlos en una base de datos para mostrarlos en un panel de administración. Hasta aquí todo normal, el problema viene cuando en los correos utiliza caracteres, que vamos a llamar extraños, como <strong>tildes</strong> por ejemplo. Cuando recibimos por código un <strong>mail</strong> que por ejemplo contenía la cadena "conexión", este texto no se nos devuelve así, sino que nos devolvería "conexi=F3n" y he aqui el problema, ya que esto no es <strong>codificación</strong> normal de <strong>UTF-8 </strong>a <strong>ASCII</strong> o similares sino que es completamente diferente.</p>
<p>Los servidores de correo utilizan protocolos bastante antiguos, en los que todo se basta en texto. Para separar encabezados se utilizan saltos de linea tipo "\r\n" o "\n" y por ejemplo para adjuntar archivos hay que declarar una marca y decirle que el contenido del archivo esta entre marca y marca. Como no, todo esta basado en <strong>texto ASCII</strong> por lo que los caracteres extraños, letras con acento, eñes y similares, suelen encontrarse en una <strong>codificación</strong> que se llama <strong>"Quoted printable"</strong>.</p>
<p><strong>Quoted Printable</strong> o simplemente acortado <strong>QP</strong> es un <strong>sistema de codificación de 8 bits compatible con ASCII</strong> que basa su <strong>codificación de caracteres extraños</strong> en un formato de un símbolo igual seguido de 2 posiciones <strong>hexadecimales</strong>. Se rige por el <strong>estándar RFC-1345</strong>. Aunque algunos lenguajes traen incorporado por defecto funciones o librerías para <strong>codificación y descodificación de caracteres</strong>, <strong>.Net</strong> no tiene nada para <strong>descodificar</strong> este tipo de <strong>codificación</strong>. A continuación os mostrare un ejemplo de <strong>función de Visual Basic</strong> para la <strong>descodificación</strong> de estos caracteres, que básicamente recoge estos c<strong>aracteres hexadecimales</strong>, los convierte a entero y obtiene el <strong>caracter de ASCII extendido</strong> de 255 caracteres, no el tradicional de 128 caracteres. De esta forma, obtendrá el carácter correcto ya traducido. Os dejo el ejemplo de la función:</p>
<p><strong>Función de descodificación de cadenas de texto Quoted Printable</strong></p>
<blockquote>
<pre class="vb"><span style="color: #b1b100;">Public</span> Shared <span style="color: #b1b100;">Function</span> QuotedPrintableDecode<span style="color: #66cc66;">&#40;</span>ByVal text <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">String</span><span style="color: #66cc66;">&#41;</span> _
<span style="color: #b1b100;">As</span> <span style="color: #b1b100;">String</span>
  <span style="color: #b1b100;">Dim</span> i <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">Integer</span>
  <span style="color: #b1b100;">Dim</span> DecodedString <span style="color: #b1b100;">As</span> StringBuilder
  <span style="color: #b1b100;">Dim</span> Chars <span style="color: #b1b100;">As</span> Char<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #b1b100;">Dim</span> CharsValue <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">String</span>
  <span style="color: #b1b100;">Dim</span> HexValue <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">Integer</span>
&nbsp;
  Chars = text.<span style="color: #66cc66;">ToCharArray</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  DecodedString = <span style="color: #b1b100;">New</span> StringBuilder
&nbsp;
  <span style="color: #b1b100;">For</span> i = <span style="color: #cc66cc;">0</span> <span style="color: #b1b100;">To</span> Chars.<span style="color: #66cc66;">Length</span> - <span style="color: #cc66cc;">1</span>
    <span style="color: #b1b100;">If</span> Chars<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span> = <span style="color: #ff0000;">&quot;=&quot;</span> <span style="color: #b1b100;">Then</span>
      CharsValue = <span style="color: #b1b100;">Nothing</span>
      HexValue = <span style="color: #b1b100;">Nothing</span>
&nbsp;
      <span style="color: #b1b100;">If</span> Chars<span style="color: #66cc66;">&#40;</span>i + <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #b1b100;">Then</span>
        CharsValue = Chars<span style="color: #66cc66;">&#40;</span>i + <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #b1b100;">Else</span>
        CharsValue = Chars<span style="color: #66cc66;">&#40;</span>i + <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> &amp;amp; Chars<span style="color: #66cc66;">&#40;</span>i + <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
&nbsp;
      HexValue = <span style="color: #b1b100;">Val</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;&amp;amp;H&quot;</span> &amp;amp; CharsValue<span style="color: #66cc66;">&#41;</span>
&nbsp;
      <span style="color: #b1b100;">If</span> CharsValue.<span style="color: #66cc66;">ToUpper</span> = <span style="color: #b1b100;">Hex</span><span style="color: #66cc66;">&#40;</span>HexValue<span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">Then</span>
        DecodedString.<span style="color: #66cc66;">Append</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">ChrW</span><span style="color: #66cc66;">&#40;</span>HexValue<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        i += <span style="color: #cc66cc;">2</span>
      <span style="color: #b1b100;">Else</span>
        DecodedString.<span style="color: #66cc66;">Append</span><span style="color: #66cc66;">&#40;</span>Chars<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
    <span style="color: #b1b100;">Else</span>
      DecodedString.<span style="color: #66cc66;">Append</span><span style="color: #66cc66;">&#40;</span>Chars<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #b1b100;">End</span> <span style="color: #b1b100;">If</span>
  <span style="color: #b1b100;">Next</span>
&nbsp;
  <span style="color: #b1b100;">Return</span> DecodedString.<span style="color: #66cc66;">ToString</span>
<span style="color: #b1b100;">End</span> Functio</pre>
</blockquote>
<p>Ahora solo hace falta llamar a esa función pasando la cadena a convertir:</p>
<blockquote>
<pre class="vb"><span style="color: #b1b100;">Public</span> Shared <span style="color: #b1b100;">Sub</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #b1b100;">Dim</span> text <span style="color: #b1b100;">As</span> <span style="color: #b1b100;">String</span> = <span style="color: #ff0000;">&quot;conexi=F3n&quot;</span>
  Console.<span style="color: #66cc66;">WriteLine</span><span style="color: #66cc66;">&#40;</span>Application.<span style="color: #66cc66;">QuotedPrintableDecode</span><span style="color: #66cc66;">&#40;</span>text<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">End</span> <span style="color: #b1b100;">Sub</span></pre>
</blockquote>
<p>El resultado de aplicar esto seria la cadena "conexión". Para que funcione es necesario importar el namespace System.Text, pero solo para el StringBuilder</p>
<blockquote>
<pre class="vb">Imports System.<span style="color: #66cc66;">Text</span></pre>
</blockquote>
<p>Espero que os sirva de ayuda.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/visual-basic-net/descodificar-quoted-printable-para-leer-correos-de-gmail-en-visual-basic/' addthis:title='Descodificar Quoted Printable para leer correos de GMail en Visual Basic ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/visual-basic-net/descodificar-quoted-printable-para-leer-correos-de-gmail-en-visual-basic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Char curiosidad de IsLetter e IsDigit</title>
		<link>http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/</link>
		<comments>http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 09:01:45 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[char]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=134</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>El otro día, nos disponíamos mi jefe y yo a realizar un control sobre un campo de texto de una aplicación web. La idea era que en este campo solo se pudiera incluir texto o números, pero en ningún caso debería de poderse incluir caracteres raros. Seamos sinceros y siempre que hemos necesitado usar esto [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>El otro día, nos disponíamos mi jefe y yo a realizar un control sobre un campo de texto de una aplicación web. La idea era que en este campo solo se pudiera <strong>incluir texto o números</strong>, pero en ningún caso debería de poderse incluir <strong>caracteres raros</strong>. Seamos sinceros y siempre que hemos necesitado usar esto en lenguajes donde su framework no estaba preparado para diferenciar que tipo de carácter era, acabamos o bien creando un array diccionario y comparando los caracteres o bien usando expresiones regulares. Como no, desde el salto a tecnología de Microsoft (en este caso <strong>Visual Basic .Net</strong>) me propuse buscar alguna clase o método que hiciera solo lo que quería hacer, y la encontré.</p>
<p>En <strong>.Net</strong> existe la <strong>clase Char</strong>, que tiene el método <strong>Char.IsLetterOrDigit</strong> (boleano) donde le indicas un <strong>char o carácter</strong> y este te devuelve true o false si es un número o letra y false si no lo es. Monto una función para recorrer carácter a carácter del campo de texto comprobando si es <strong>alfanumérico</strong> o no, con la idea de borrar los caracteres que no sean <strong>alfanuméricos</strong>. Una vez montada la función, la pruebo unas cuantas veces y todo funciona estupendamente. Cuando nos vamos a disponer a subir a producción... sorpresa, la última prueba a fallado (pero es imposible), se nos deslizo el dedo y por poner un "1", pusimos un <strong>"º"</strong>. Cuando nos ponemos a investigar (ha probar con jabatos) nos damos cuenta de que esta función, establece que los caracteres <strong>"º"</strong> y <strong>"ª"</strong> son <strong>alfanuméricos</strong>, vamos que son letras, supongo que la <strong>"o"</strong> y la <strong>"a"</strong>.</p>
<p>Por supuesto esto lo controlamos y listo, pero si alguien se encuentra en nuestra misma situación y conoce alguna función que si trabaje correctamente que lo comente. Y si alguien buscando por internet se encuentra bloqueado y se ve encuentra con este post, ya puede respirar tranquilo, porque no es que funcione mal, es que no funciona del todo bien. (Si, ya se que para algunos <strong>"º"</strong> y <strong>"ª"</strong> son letras, pero realmente son caracteres especiales)</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

