cp850

Descripción del contenido de la página

Programa en Forth para crear el código fuente de la definición de una matriz en PHP que sirva para traducir del juego de caracteres cp850 a Unicode.

Etiquetas:

Tras publicar los últimos días varios programas tan encantadores como inútiles de hace veintitantos años, hoy voy a publicar uno muy útil de hace veintitantos minutos.

Para la gestión de programandala.net uso un programa en PHP escrito por mí, un sistema de mantenimiento de sedes (lo que en inglés se denomina WRS o CMS). Una de las funcionalidades que le programé me permite insertar código fuente en las páginas sacado directamente de los ficheros originales de mis programas. Por supuesto hay que traducir automáticamente los caracteres según el formato del fichero original. Por ejemplo, la Sinclair QL usa un juego de caracteres propio; la Psion 5mx usa el juego de caracteres Windows -1252, los ficheros escritos en Debian usan Unicode con codificación UTF -8... pero me faltaba la traducción de los juegos de caracteres del sistema operativo DOS, en especial la página de códigos 850 (CP850), que era la más frecuente para las lenguas de Europa occidental.

Necesitaba añadir a mi programa en PHP unas pocas líneas de código... pero muchas líneas de datos, una por cada carácter a traducir, con su número en CP850 y su equivalente en Unicode. Iba a ser un trabajo lento y aburrido. ¿Pero para qué están las computadoras? Escribir a mano los numeritos no me lo iba a quitar nadie (no encontré una lista aprovechable en parte alguna) pero al menos serían sólo los numeritos. Escribí un breve programa en Forth que hizo el trabajo sucio por mí: yo le proporcioné la lista de pares de números en hexadecimal y él me construyó la definición de mi matriz en PHP, lista para ser incorporada al programa.

Las equivalencias de los caracteres de CP850 en Unicode las obtuve del artículo de Wikipedia Code Page 850.

Código fuente

\ cp850.fs

\ Copyright (C) 2009,2014 Marcos Cruz (http://programandala.net)
\ Licencia/License: http://programandala.net/license

\ This program creates PHP code with an array to translate CP850 codes into HTML Unicode.
\ Written in ANS Forth.
\ Tested with Gforth.

\ 2009-06-09: First version.
\ 2014-10-17: Changes:
\   - "<?php" and "?>" added to the output file;
\   - explicit hex notation used in the translation data;
\   - 'bye' added at the end of the process.
\   - source code layout changed;
\   - main word renamed to 'run'.

\ Usage:
\   gforth cp850.fs -e run > cp850.inc.php

\ CP850 translations to Unicode

0x00 0x0000 \ end of data

0x01 0x263A
0x02 0x263B
0x03 0x2665
0x04 0x2666
0x05 0x2665
0x06 0x2660
0x07 0x2022
0x08 0x25D8
0x09 0x25CB
0x0A 0x25D9
0x0B 0x2642
0x0C 0x2640
0x0D 0x266A
0x0E 0x266B
0x0F 0x263C
0x10 0x25BA
0x11 0x25C4
0x12 0x2195
0x13 0x203C
0x14 0x00B6
0x15 0x00A7
0x16 0x25AC
0x17 0x21A8
0x18 0x2191
0x19 0x2193
0x1A 0x2192
0x1B 0x2190
0x1C 0x221F
0x1D 0x2194
0x1E 0x25B2
0x1F 0x25B5

0x7F 0x2302
0x80 0x00C7
0x81 0x00FC
0x82 0x00E9
0x83 0x00E2
0x84 0x00E4
0x85 0x00E0
0x86 0x00E5
0x87 0x00E7
0x88 0x00EA
0x89 0x00EB
0x8A 0x00E8
0x8B 0x00EF
0x8C 0x00EE
0x8D 0x00EC
0x8E 0x00C4
0x8F 0x00C5
0x90 0x00C9
0x91 0x00E6
0x92 0x00C6
0x93 0x00F4
0x94 0x00F6
0x95 0x00F2
0x96 0x00FB
0x97 0x00F9
0x98 0x00FF
0x99 0x00D6
0x9A 0x00DC
0x9B 0x00F8
0x9C 0x00A3
0x9D 0x00D8
0x9E 0x00D7
0x9F 0x0192
0xA0 0x00E1
0xA1 0x00ED
0xA2 0x00F3
0xA3 0x00FA
0xA4 0x00F1
0xA5 0x00D1
0xA6 0x00AA
0xA7 0x00BA
0xA8 0x00BF
0xA9 0x00AE
0xAA 0x00AC
0xAB 0x00BD
0xAC 0x00BC
0xAD 0x00A1
0xAE 0x00AB
0xAF 0x00BB
0xB0 0x2591
0xB1 0x2992
0xB2 0x2593
0xB3 0x2502
0xB4 0x2524
0xB5 0x00C1
0xB6 0x00C2
0xB7 0x00C0
0xB8 0x00A9
0xB9 0x2563
0xBA 0x2551
0xBB 0x2557
0xBC 0x255D
0xBD 0x00A2
0xBE 0x00A5
0xBF 0x2510
0xC0 0x2514
0xC1 0x2534
0xC2 0x252C
0xC3 0x251C
0xC4 0x2500
0xC5 0x253C
0xC6 0x00E3
0xC7 0x00C3
0xC8 0x255A
0xC9 0x2554
0xCA 0x2569
0xCB 0x2566
0xCC 0x2560
0xCD 0x2550
0xCE 0x256C
0xCF 0x00A4
0xD0 0x00F0
0xD1 0x00D0
0xD2 0x00CA
0xD3 0x00CB
0xD4 0x00C8
0xD5 0x0131
0xD6 0x00CD
0xD7 0x00CE
0xD8 0x00CF
0xD9 0x2518
0xDA 0x250C
0xDB 0x2588
0xDC 0x2584
0xDD 0x00A6
0xDE 0x00CC
0xDF 0x2580
0xE0 0x00D3
0xE1 0x00DF
0xE2 0x00D4
0xE3 0x00D2
0xE4 0x00F5
0xE5 0x00D5
0xE6 0x00B5
0xE7 0x00FE
0xE8 0x00DE
0xE9 0x00DA
0xEA 0x00DB
0xEB 0x00D9
0xEC 0x00FD
0xED 0x00DD
0xEE 0x00AF
0xEF 0x00B4
0xF0 0x00AD
0xF1 0x00B1
0xF2 0x2017
0xF3 0x00BE
0xF4 0x00B6
0xF5 0x00A7
0xF6 0x00F7
0xF7 0x00B8
0xF8 0x00B0
0xF9 0x00A8
0xFA 0x00B7
0xFB 0x00B9
0xFC 0x00B3
0xFD 0x00B2
0xFE 0x25A0
0xFF 0x00A0

: .cp850  ( c -- )
  [char] " emit ." \x" hex 1 .r [char] " emit decimal  ;
: .unicode  ( u -- )
  ." '&#" 1 .r ." ;'"  ;
: more?  ( c u -- c u f )
  2dup +  ;
: .comma  ( c u -- c u )
  more?  if  [char] , emit  then  ;
: .element  ( c u -- )
  swap .cp850 ."  => " .unicode .comma cr ;
: .elements  ( 0 0 c1 u1 ... cn un -- )
  begin  more?  while .element  repeat  2drop  ;
: .start  ( -- )
  ." <?php" cr cr ." $cp850 = array (" cr cr ;
: .end  ( -- )
  cr ." );" cr cr ." ?>" cr  ;
: run ( 0 0 c1 u1 ... cn un -- )
  .start .elements .end bye  ;

\ end of cp850.fs

Resultado

Esta es la salida del programa, lista para ser incorporada a mi programa en PHP:

<?php

$cp850 = array (

"\xFF" => '&#160;',
"\xFE" => '&#9632;',
"\xFD" => '&#178;',
"\xFC" => '&#179;',
"\xFB" => '&#185;',
"\xFA" => '&#183;',
"\xF9" => '&#168;',
"\xF8" => '&#176;',
"\xF7" => '&#184;',
"\xF6" => '&#247;',
"\xF5" => '&#167;',
"\xF4" => '&#182;',
"\xF3" => '&#190;',
"\xF2" => '&#8215;',
"\xF1" => '&#177;',
"\xF0" => '&#173;',
"\xEF" => '&#180;',
"\xEE" => '&#175;',
"\xED" => '&#221;',
"\xEC" => '&#253;',
"\xEB" => '&#217;',
"\xEA" => '&#219;',
"\xE9" => '&#218;',
"\xE8" => '&#222;',
"\xE7" => '&#254;',
"\xE6" => '&#181;',
"\xE5" => '&#213;',
"\xE4" => '&#245;',
"\xE3" => '&#210;',
"\xE2" => '&#212;',
"\xE1" => '&#223;',
"\xE0" => '&#211;',
"\xDF" => '&#9600;',
"\xDE" => '&#204;',
"\xDD" => '&#166;',
"\xDC" => '&#9604;',
"\xDB" => '&#9608;',
"\xDA" => '&#9484;',
"\xD9" => '&#9496;',
"\xD8" => '&#207;',
"\xD7" => '&#206;',
"\xD6" => '&#205;',
"\xD5" => '&#305;',
"\xD4" => '&#200;',
"\xD3" => '&#203;',
"\xD2" => '&#202;',
"\xD1" => '&#208;',
"\xD0" => '&#240;',
"\xCF" => '&#164;',
"\xCE" => '&#9580;',
"\xCD" => '&#9552;',
"\xCC" => '&#9568;',
"\xCB" => '&#9574;',
"\xCA" => '&#9577;',
"\xC9" => '&#9556;',
"\xC8" => '&#9562;',
"\xC7" => '&#195;',
"\xC6" => '&#227;',
"\xC5" => '&#9532;',
"\xC4" => '&#9472;',
"\xC3" => '&#9500;',
"\xC2" => '&#9516;',
"\xC1" => '&#9524;',
"\xC0" => '&#9492;',
"\xBF" => '&#9488;',
"\xBE" => '&#165;',
"\xBD" => '&#162;',
"\xBC" => '&#9565;',
"\xBB" => '&#9559;',
"\xBA" => '&#9553;',
"\xB9" => '&#9571;',
"\xB8" => '&#169;',
"\xB7" => '&#192;',
"\xB6" => '&#194;',
"\xB5" => '&#193;',
"\xB4" => '&#9508;',
"\xB3" => '&#9474;',
"\xB2" => '&#9619;',
"\xB1" => '&#10642;',
"\xB0" => '&#9617;',
"\xAF" => '&#187;',
"\xAE" => '&#171;',
"\xAD" => '&#161;',
"\xAC" => '&#188;',
"\xAB" => '&#189;',
"\xAA" => '&#172;',
"\xA9" => '&#174;',
"\xA8" => '&#191;',
"\xA7" => '&#186;',
"\xA6" => '&#170;',
"\xA5" => '&#209;',
"\xA4" => '&#241;',
"\xA3" => '&#250;',
"\xA2" => '&#243;',
"\xA1" => '&#237;',
"\xA0" => '&#225;',
"\x9F" => '&#402;',
"\x9E" => '&#215;',
"\x9D" => '&#216;',
"\x9C" => '&#163;',
"\x9B" => '&#248;',
"\x9A" => '&#220;',
"\x99" => '&#214;',
"\x98" => '&#255;',
"\x97" => '&#249;',
"\x96" => '&#251;',
"\x95" => '&#242;',
"\x94" => '&#246;',
"\x93" => '&#244;',
"\x92" => '&#198;',
"\x91" => '&#230;',
"\x90" => '&#201;',
"\x8F" => '&#197;',
"\x8E" => '&#196;',
"\x8D" => '&#236;',
"\x8C" => '&#238;',
"\x8B" => '&#239;',
"\x8A" => '&#232;',
"\x89" => '&#235;',
"\x88" => '&#234;',
"\x87" => '&#231;',
"\x86" => '&#229;',
"\x85" => '&#224;',
"\x84" => '&#228;',
"\x83" => '&#226;',
"\x82" => '&#233;',
"\x81" => '&#252;',
"\x80" => '&#199;',
"\x7F" => '&#8962;',
"\x1F" => '&#9653;',
"\x1E" => '&#9650;',
"\x1D" => '&#8596;',
"\x1C" => '&#8735;',
"\x1B" => '&#8592;',
"\x1A" => '&#8594;',
"\x19" => '&#8595;',
"\x18" => '&#8593;',
"\x17" => '&#8616;',
"\x16" => '&#9644;',
"\x15" => '&#167;',
"\x14" => '&#182;',
"\x13" => '&#8252;',
"\x12" => '&#8597;',
"\x11" => '&#9668;',
"\x10" => '&#9658;',
"\xF" => '&#9788;',
"\xE" => '&#9835;',
"\xD" => '&#9834;',
"\xC" => '&#9792;',
"\xB" => '&#9794;',
"\xA" => '&#9689;',
"\x9" => '&#9675;',
"\x8" => '&#9688;',
"\x7" => '&#8226;',
"\x6" => '&#9824;',
"\x5" => '&#9829;',
"\x4" => '&#9830;',
"\x3" => '&#9829;',
"\x2" => '&#9787;',
"\x1" => '&#9786;'

);

?>

Descargas