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.
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
.
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
Sigue las siguientes indicaciones para entregar tu actividad:
Agrega en un comentario al inicio del archivo fuente los nombres y matrículas de los autores. Por ejemplo:
/*-------------------------------------------------------------------
* Práctica 4: Decodificador UTF-8
* Fecha: 06-Feb-2014
* Autores:
* 1166611 Pepper Pots
* 1160611 Anthony Stark
*-------------------------------------------------------------------*/
Fecha límite: Jueves, Febrero 6.
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. |