Estás en:   ArielOrtiz.com > Programación avanzada > Práctica 4: Decodificador UTF-8

Práctica 4: Decodificador UTF-8

Objetivos

Durante esta actividad, los alumnos serán capaces de:

Esta actividad promueve las siguientes habilidades, valores y actitudes: análisis y síntesis, capacidad para resolver problemas, creatividad, y uso eficiente de la informática y las telecomunicaciones.

Descripción

Esta actividad debe ser elaborada de manera individual o en parejas.

UTF-8 (Unicode Transformation Format 8-bit) es un formato de codificación de caracteres Unicode que utiliza elementos de longitud variable. La siguiente tabla muestra la forma en que se codifican los caracteres bajo este formato:

Rango de puntos
de código
Byte 1 Byte 2 Byte 3 Byte 4
0x000000 –
0x00007F
0xxxxxxx
0x000080 –
0x0007FF
110xxxxx 10xxxxxx
0x000800 –
0x00FFFF
1110xxxx 10xxxxxx 10xxxxxx
0x010000 –
0x10FFFF
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Escribe un programa en lenguaje C que corra sobre Linux y que realice la decodificación de un archivo de texto UTF-8 imprimiendo una tabla en la salida estándar tal como se muestra en los ejemplos de abajo. Para caracteres cuyo punto de código sea menor a 0x20, en su lugar se debe imprimir un punto (.) como glifo. Dentro de la tabla que se imprime todos los números están en hexadecimal. El nombre del archivo de entrada debe ser indicado como argumento desde la línea de comando. No se debe suponer que el archivo de entrada tiene cierto tamaño. El nombre del archivo fuente debe ser decode.c.

Ejemplos

Si no se indica el nombre del archivo como argumento de la línea de comando (o si se indica más de un argumento), el programa debe mostrar un mensaje de error y terminar:

$ ./decode
Se debe indicar el nombre del archivo.

Este ejemplo utiliza el archivo test1.txt, el cual contiene caracteres que codificados usan de 1 a 4 bytes cada uno:

$ ./decode test1.txt
==================================
indx   unicode  utf-8        glyph
==================================
0000   000049   49             I
0001   000063   63             c
0002   000068   68             h
0003   000020   20              
0004   002764   e2 9d a4       ❤
0005   000020   20              
0006   00004d   4d             M
0007   0000fc   c3 bc          ü
0008   00006e   6e             n
0009   000063   63             c
000a   000068   68             h
000b   000065   65             e
000c   00006e   6e             n
000d   00000a   0a             .
000e   0065e9   e6 97 a9       早
000f   004e0a   e4 b8 8a       上
0010   00597d   e5 a5 bd       好
0011   000020   20              
0012   0065e9   e6 97 a9       早
0013   00000a   0a             .
0014   003042   e3 81 82       あ
0015   00308a   e3 82 8a       り
0016   00304c   e3 81 8c       が
0017   003068   e3 81 a8       と
0018   003046   e3 81 86       う
0019   00000a   0a             .
001a   000049   49             I
001b   000020   20              
001c   002764   e2 9d a4       ❤
001d   000020   20              
001e   0020ac   e2 82 ac       €
001f   000075   75             u
0020   000072   72             r
0021   00006f   6f             o
0022   000070   70             p
0023   000065   65             e
0024   00000a   0a             .
0025   000047   47             G
0026   00006f   6f             o
0027   000074   74             t
0028   000068   68             h
0029   000069   69             i
002a   000063   63             c
002b   000020   20              
002c   000063   63             c
002d   000068   68             h
002e   000061   61             a
002f   000072   72             r
0030   000073   73             s
0031   00003a   3a             :
0032   000020   20              
0033   010344   f0 90 8d 84    𐍄
0034   010348   f0 90 8d 88    𐍈
0035   01033d   f0 90 8c bd    𐌽
0036   010344   f0 90 8d 84    𐍄
0037   010348   f0 90 8d 88    𐍈
0038   000020   20              
0039   00000a   0a             .
003a   01034a   f0 90 8d 8a    𐍊
003b   000020   20              
003c   002702   e2 9c 82       ✂
003d   000020   20              
003e   002708   e2 9c 88       ✈
003f   000020   20              
0040   00270d   e2 9c 8d       ✍
0041   000020   20              
0042   002718   e2 9c 98       ✘
0043   000020   20              
0044   002721   e2 9c a1       ✡
0045   000020   20              
0046   002720   e2 9c a0       ✠
0047   000020   20              
0048   00273d   e2 9c bd       ✽
0049   00000a   0a             .
004a   000046   46             F
004b   000069   69             i
004c   00006e   6e             n
004d   000021   21             !
004e   00000a   0a             .
==================================
Número total de caracteres : 79
Número total de bytes      : 136

Este otro ejemplo utiliza el archivo test2.txt, el cual solo contiene caracteres ASCII, por lo cual cada caracter requiere un solo byte al momento de ser codificado:

$ ./decode test2.txt
==================================
indx   unicode  utf-8        glyph
==================================
0000   000054   54             T
0001   00006f   6f             o
0002   000020   20              
0003   000062   62             b
0004   000065   65             e
0005   00002c   2c             ,
0006   000020   20              
0007   00006f   6f             o
0008   000072   72             r
0009   000020   20              
000a   00006e   6e             n
000b   00006f   6f             o
000c   000074   74             t
000d   000020   20              
000e   000074   74             t
000f   00006f   6f             o
0010   000020   20              
0011   000062   62             b
0012   000065   65             e
0013   00003a   3a             :
0014   000020   20              
0015   000074   74             t
0016   000068   68             h
0017   000061   61             a
0018   000074   74             t
0019   000020   20              
001a   000069   69             i
001b   000073   73             s
001c   000020   20              
001d   000074   74             t
001e   000068   68             h
001f   000065   65             e
0020   000020   20              
0021   000071   71             q
0022   000075   75             u
0023   000065   65             e
0024   000073   73             s
0025   000074   74             t
0026   000069   69             i
0027   00006f   6f             o
0028   00006e   6e             n
0029   00003a   3a             :
002a   00000a   0a             .
002b   000057   57             W
002c   000068   68             h
002d   000065   65             e
002e   000074   74             t
002f   000068   68             h
0030   000065   65             e
0031   000072   72             r
0032   000020   20              
0033   000027   27             '
0034   000074   74             t
0035   000069   69             i
0036   000073   73             s
0037   000020   20              
0038   00006e   6e             n
0039   00006f   6f             o
003a   000062   62             b
003b   00006c   6c             l
003c   000065   65             e
003d   000072   72             r
003e   000020   20              
003f   000069   69             i
0040   00006e   6e             n
0041   000020   20              
0042   000074   74             t
0043   000068   68             h
0044   000065   65             e
0045   000020   20              
0046   00006d   6d             m
0047   000069   69             i
0048   00006e   6e             n
0049   000064   64             d
004a   000020   20              
004b   000074   74             t
004c   00006f   6f             o
004d   000020   20              
004e   000073   73             s
004f   000075   75             u
0050   000066   66             f
0051   000066   66             f
0052   000065   65             e
0053   000072   72             r
0054   00000a   0a             .
0055   000054   54             T
0056   000068   68             h
0057   000065   65             e
0058   000020   20              
0059   000073   73             s
005a   00006c   6c             l
005b   000069   69             i
005c   00006e   6e             n
005d   000067   67             g
005e   000073   73             s
005f   000020   20              
0060   000061   61             a
0061   00006e   6e             n
0062   000064   64             d
0063   000020   20              
0064   000061   61             a
0065   000072   72             r
0066   000072   72             r
0067   00006f   6f             o
0068   000077   77             w
0069   000073   73             s
006a   000020   20              
006b   00006f   6f             o
006c   000066   66             f
006d   000020   20              
006e   00006f   6f             o
006f   000075   75             u
0070   000074   74             t
0071   000072   72             r
0072   000061   61             a
0073   000067   67             g
0074   000065   65             e
0075   00006f   6f             o
0076   000075   75             u
0077   000073   73             s
0078   000020   20              
0079   000066   66             f
007a   00006f   6f             o
007b   000072   72             r
007c   000074   74             t
007d   000075   75             u
007e   00006e   6e             n
007f   000065   65             e
0080   00002c   2c             ,
0081   00000a   0a             .
0082   00004f   4f             O
0083   000072   72             r
0084   000020   20              
0085   000074   74             t
0086   00006f   6f             o
0087   000020   20              
0088   000074   74             t
0089   000061   61             a
008a   00006b   6b             k
008b   000065   65             e
008c   000020   20              
008d   000061   61             a
008e   000072   72             r
008f   00006d   6d             m
0090   000073   73             s
0091   000020   20              
0092   000061   61             a
0093   000067   67             g
0094   000061   61             a
0095   000069   69             i
0096   00006e   6e             n
0097   000073   73             s
0098   000074   74             t
0099   000020   20              
009a   000061   61             a
009b   000020   20              
009c   000073   73             s
009d   000065   65             e
009e   000061   61             a
009f   000020   20              
00a0   00006f   6f             o
00a1   000066   66             f
00a2   000020   20              
00a3   000074   74             t
00a4   000072   72             r
00a5   00006f   6f             o
00a6   000075   75             u
00a7   000062   62             b
00a8   00006c   6c             l
00a9   000065   65             e
00aa   000073   73             s
00ab   00002c   2c             ,
00ac   00000a   0a             .
00ad   000041   41             A
00ae   00006e   6e             n
00af   000064   64             d
00b0   000020   20              
00b1   000062   62             b
00b2   000079   79             y
00b3   000020   20              
00b4   00006f   6f             o
00b5   000070   70             p
00b6   000070   70             p
00b7   00006f   6f             o
00b8   000073   73             s
00b9   000069   69             i
00ba   00006e   6e             n
00bb   000067   67             g
00bc   000020   20              
00bd   000065   65             e
00be   00006e   6e             n
00bf   000064   64             d
00c0   000020   20              
00c1   000074   74             t
00c2   000068   68             h
00c3   000065   65             e
00c4   00006d   6d             m
00c5   00003f   3f             ?
00c6   000020   20              
00c7   000054   54             T
00c8   00006f   6f             o
00c9   000020   20              
00ca   000064   64             d
00cb   000069   69             i
00cc   000065   65             e
00cd   00003a   3a             :
00ce   000020   20              
00cf   000074   74             t
00d0   00006f   6f             o
00d1   000020   20              
00d2   000073   73             s
00d3   00006c   6c             l
00d4   000065   65             e
00d5   000065   65             e
00d6   000070   70             p
00d7   00002e   2e             .
00d8   00000a   0a             .
==================================
Número total de caracteres : 217
Número total de bytes      : 217

¿Qué se debe entregar?

Sigue las siguientes indicaciones para entregar tu actividad:

Fecha límite: Jueves, Febrero 6.

Evaluación

Esta actividad será evaluada usando los siguientes criterios:

100 La actividad cumple con todos los requerimientos.
-10 No se incluyó en comentario los datos de los autores.
10 El programa fuente produce errores al momento de compilarlo.
50-90 El programa tiene algún error a tiempo de ejecución.
DA El programa es un plagio.