¡Bienvenido/a a la sexta entrega de mi serie de utilidades para Business Central! En esta ocasión, quiero enseñarte a manejar conversiones de caracteres, algo esencial para gestionar cadenas de texto con símbolos especiales o formatos incompatibles. Aquí encontrarás procedimientos que convierten caracteres Unicode a su representación estándar y realizan transformaciones entre ANSI y ASCII, optimizando la interoperabilidad en tus desarrollos.
¡Vamos manos a la obra! 😱
1. Convertir caracteres Unicode escapados a su representación estándar
Cuando trabajas con cadenas de texto, es posible encontrar caracteres Unicode en su formato escapado, como \u00e1
para la letra á
. Para facilitar la legibilidad y el procesamiento, puedes usar el procedimiento ConvertEscapeUnicode
, que sustituye estos valores por sus caracteres equivalentes. Este es el código:
procedure ConvertEscapeUnicode(TextToConvert: Text) ReturnValue: Text
var
ValueText: Text;
begin
ValueText := TextToConvert;
ValueText := ValueText.Replace('\u00c0', 'À');
ValueText := ValueText.Replace('\u00c1', 'Á');
ValueText := ValueText.Replace('\u00c2', 'Â');
ValueText := ValueText.Replace('\u00c3', 'Ã');
ValueText := ValueText.Replace('\u00c4', 'Ä');
ValueText := ValueText.Replace('\u00c5', 'Å');
ValueText := ValueText.Replace('\u00c6', 'Æ');
ValueText := ValueText.Replace('\u00c7', 'Ç');
ValueText := ValueText.Replace('\u00c8', 'È');
ValueText := ValueText.Replace('\u00c9', 'É');
ValueText := ValueText.Replace('\u00ca', 'Ê');
ValueText := ValueText.Replace('\u00cb', 'Ë');
ValueText := ValueText.Replace('\u00cc', 'Ì');
ValueText := ValueText.Replace('\u00cd', 'Í');
ValueText := ValueText.Replace('\u00ce', 'Î');
ValueText := ValueText.Replace('\u00cf', 'Ï');
ValueText := ValueText.Replace('\u00d1', 'Ñ');
ValueText := ValueText.Replace('\u00d2', 'Ò');
ValueText := ValueText.Replace('\u00d3', 'Ó');
ValueText := ValueText.Replace('\u00d4', 'Ô');
ValueText := ValueText.Replace('\u00d5', 'Õ');
ValueText := ValueText.Replace('\u00d6', 'Ö');
ValueText := ValueText.Replace('\u00d8', 'Ø');
ValueText := ValueText.Replace('\u00d9', 'Ù');
ValueText := ValueText.Replace('\u00da', 'Ú');
ValueText := ValueText.Replace('\u00db', 'Û');
ValueText := ValueText.Replace('\u00dc', 'Ü');
ValueText := ValueText.Replace('\u00dd', 'Ý');
ValueText := ValueText.Replace('\u00df', 'ß');
ValueText := ValueText.Replace('\u00e0', 'à');
ValueText := ValueText.Replace('\u00e1', 'á');
ValueText := ValueText.Replace('\u00e2', 'â');
ValueText := ValueText.Replace('\u00e3', 'ã');
ValueText := ValueText.Replace('\u00e4', 'ä');
ValueText := ValueText.Replace('\u00e5', 'å');
ValueText := ValueText.Replace('\u00e6', 'æ');
ValueText := ValueText.Replace('\u00e7', 'ç');
ValueText := ValueText.Replace('\u00e8', 'è');
ValueText := ValueText.Replace('\u00e9', 'é');
ValueText := ValueText.Replace('\u00ea', 'ê');
ValueText := ValueText.Replace('\u00eb', 'ë');
ValueText := ValueText.Replace('\u00ec', 'ì');
ValueText := ValueText.Replace('\u00ed', 'í');
ValueText := ValueText.Replace('\u00ee', 'î');
ValueText := ValueText.Replace('\u00ef', 'ï');
ValueText := ValueText.Replace('\u00f0', 'ð');
ValueText := ValueText.Replace('\u00f1', 'ñ');
ValueText := ValueText.Replace('\u00f2', 'ò');
ValueText := ValueText.Replace('\u00f3', 'ó');
ValueText := ValueText.Replace('\u00f4', 'ô');
ValueText := ValueText.Replace('\u00f5', 'õ');
ValueText := ValueText.Replace('\u00f6', 'ö');
ValueText := ValueText.Replace('\u00f8', 'ø');
ValueText := ValueText.Replace('\u00f9', 'ù');
ValueText := ValueText.Replace('\u00fa', 'ú');
ValueText := ValueText.Replace('\u00fb', 'û');
ValueText := ValueText.Replace('\u00fc', 'ü');
ValueText := ValueText.Replace('\u00fd', 'ý');
ValueText := ValueText.Replace('\u00ff', 'ÿ');
ReturnValue := ValueText;
end;
En este procedimiento, comienzo declarando una variable local llamada ValueText
, que copia el valor del texto a convertir. Luego, utilizo el método Replace
en un bucle para reemplazar cada secuencia escapada (como \u00c0
) por su carácter correspondiente (À
). Este enfoque asegura que el texto se traduzca correctamente en cualquier contexto que necesite caracteres legibles, como informes, integraciones o interfaces de usuario.
Este procedimiento resulta especialmente útil al trabajar con datos importados desde fuentes externas, como servicios web o archivos JSON, donde los caracteres Unicode suelen aparecer escapados. La conversión garantiza que el texto se interprete de manera correcta y facilite la experiencia del usuario.
2. Convertir texto entre ANSI y ASCII
En algunos casos, es necesario transformar caracteres entre los formatos ANSI y ASCII para garantizar la compatibilidad con diferentes sistemas o bases de datos. Aquí te presento dos procedimientos: Ansi2Ascii
y Ascii2Ansi
, que realizan estas conversiones de manera eficiente. Veamos primero el código del procedimiento Ansi2Ascii
:
procedure Ansi2Ascii(_Text: Text[250]): Text[250]
begin
MakeVars();
exit(CONVERTSTR(_Text, AnsiStr, AsciiStr));
end;
El procedimiento Ansi2Ascii
utiliza el método CONVERTSTR
, que sustituye caracteres en función de dos cadenas de referencia: AnsiStr
y AsciiStr
. Estas cadenas contienen los caracteres equivalentes en cada formato. Antes de la conversión, se llama a MakeVars
, un procedimiento que inicializa las cadenas de mapeo.
Ahora veamos el procedimiento Ascii2Ansi
:
procedure Ascii2Ansi(_Text: Text[250]): Text[250]
begin
MakeVars();
exit(CONVERTSTR(_Text, AsciiStr, AnsiStr));
end;
El procedimiento Ascii2Ansi
sigue la misma lógica, pero invierte las cadenas de referencia, permitiendo la conversión de ASCII a ANSI. En ambos casos, el texto que se pasa como parámetro _Text
es procesado y devuelto en el formato deseado.
Para entender cómo funcionan estas conversiones, aquí está el procedimiento MakeVars
, encargado de definir las cadenas de referencia:
procedure MakeVars()
begin
AsciiStr := 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»¦¦¦¦¦ÁÂÀ©¦¦++¢¥++--+-+ãÃ++--¦-+';
AsciiStr := AsciiStr + '¤ðÐÊËÈiÍÎÏ++¦_¦Ì¯ÓßÔÒõÕµþÞÚÛÙýݯ´±=¾¶§÷¸°¨·¹³²¦ ';
CharVar[1] := 196;
CharVar[2] := 197;
CharVar[3] := 201;
CharVar[4] := 242;
CharVar[5] := 220;
CharVar[6] := 186;
CharVar[7] := 191;
CharVar[8] := 188;
CharVar[9] := 187;
CharVar[10] := 193;
CharVar[11] := 194;
CharVar[12] := 192;
CharVar[13] := 195;
CharVar[14] := 202;
CharVar[15] := 203;
CharVar[16] := 200;
CharVar[17] := 205;
CharVar[18] := 206;
CharVar[19] := 204;
CharVar[20] := 175;
CharVar[21] := 223;
CharVar[22] := 213;
CharVar[23] := 254;
CharVar[24] := 218;
CharVar[25] := 219;
CharVar[26] := 217;
CharVar[27] := 180;
CharVar[28] := 177;
CharVar[29] := 176;
CharVar[30] := 185;
CharVar[31] := 179;
CharVar[32] := 178;
AnsiStr := 'óÚÔõÓÕþÛÙÞ´¯ý' + FORMAT(CharVar[1]) + FORMAT(CharVar[2]) + FORMAT(CharVar[3]) + 'µã¶÷' + FORMAT(CharVar[4]);
AnsiStr := AnsiStr + '¹¨ Í' + FORMAT(CharVar[5]) + '°úÏÎâßݾ·±Ð¬' + FORMAT(CharVar[6]) + FORMAT(CharVar[7]);
AnsiStr := AnsiStr + '«¼¢' + FORMAT(CharVar[8]) + 'í½' + FORMAT(CharVar[9]) + '___ªª' + FORMAT(CharVar[10]) + FORMAT(CharVar[11]);
AnsiStr := AnsiStr + FORMAT(CharVar[12]) + '®ªª++óÑ++--+-+Ò' + FORMAT(CharVar[13]) + '++--ª-+ñð';
AnsiStr := AnsiStr + FORMAT(CharVar[14]) + FORMAT(CharVar[15]) + FORMAT(CharVar[16]) + 'i' + FORMAT(CharVar[17]) + FORMAT(CharVar[18]);
AnsiStr := AnsiStr + '¤++__ª' + FORMAT(CharVar[19]) + FORMAT(CharVar[20]) + 'Ë' + FORMAT(CharVar[21]) + 'Èʧ';
AnsiStr := AnsiStr + FORMAT(CharVar[22]) + 'Á' + FORMAT(CharVar[23]) + 'Ì' + FORMAT(CharVar[24]) + FORMAT(CharVar[25]);
AnsiStr := AnsiStr + FORMAT(CharVar[26]) + '²¦»' + FORMAT(CharVar[27]) + '¡' + FORMAT(CharVar[28]) + '=¥Âº¸©' + FORMAT(CharVar[29]);
AnsiStr := AnsiStr + '¿À' + FORMAT(CharVar[30]) + FORMAT(CharVar[31]) + FORMAT(CharVar[32]) + '_ ';
end;
En MakeVars
, inicializo las cadenas AsciiStr
y AnsiStr
con los caracteres que representan equivalencias entre los dos formatos. También utilizo un array CharVar
para manejar caracteres específicos que necesitan ser mapeados con precisión. Esto asegura que los procedimientos puedan gestionar una amplia gama de caracteres especiales.
Beneficios y Aplicaciones
Estas funciones son herramientas poderosas para gestionar y manipular cadenas de texto en Business Central. Algunos beneficios clave incluyen:
- Interoperabilidad: Facilitan la comunicación entre sistemas que utilizan distintos estándares de codificación.
- Mejora de la legibilidad: Convierte caracteres Unicode escapados para garantizar que los textos sean fáciles de entender y procesar.
- Personalización: Permiten ajustes específicos según el formato de caracteres requerido en cada caso.
- Eficiencia: Automatizan procesos de conversión que, de otro modo, serían tediosos de manejar manualmente.
Conclusión
En esta sexta entrega, he explorado cómo manejar caracteres especiales con procedimientos para convertir texto entre formatos Unicode, ANSI y ASCII en AL. Estas herramientas son esenciales para optimizar la gestión de cadenas de texto en proyectos de Business Central y asegurar la compatibilidad con diferentes sistemas.
Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.
Si tienes dudas o ideas, estaré encantado de escucharlas.
¡Nos vemos en la próxima entrega!