Caracteres de um texto em geral são representados em C pelo tipo char, que tipicamente num PC tem o tamanho de 1 byte e pode armazenar apenas 256 (28) valores diferentes. Porém isto não é suficiente para armazenar conjuntamente caracteres em inglês, português, chinês, japonês, hebraico, entre outros idiomas atualmente falados.
Para lidar com essa questão, foi criada a codificação UNICODE, que relaciona números a caracteres. Atualmente o UNICODE é capaz de representar caracteres de todos os idiomas falados, além de símbolos e outros tipos de caracteres.
Assim como acontece com a representação de números inteiros negativos, onde o complemento a dois é uma forma de codificação, existem algumas formas de codificação de caracteres UNICODE. Para este trabalho, as codificações de interesse são UTF-32 e UTF-8.
A codificação UTF-32 é simplesmente a representação numérica do código do caracter. Como UTF-32 utiliza 4 bytes, essa codificação é suficiente para representar todos os códigos previstos no UNICODE, não sendo necessária maior elaboração.
Já no formato UTF-8, os caracteres têm tamanho variável. Um caracter tem tamanho mínimo de 8 bits, porém, se seu código necessitar de mais espaço para ser representado, o formato UTF-8 pode utilizar mais de um byte para representá-lo. Abaixo é apresentada a faixa dos números e o número de bytes necessários para representar cada faixa do código UNICODE (onde x é o valor real do bit):
Código UNICODE Representação UTF-8 U+0000 - U+007F 0xxxxxxx U+0080 - U+07FF 110xxxxx 10xxxxxx U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx U+10000 - U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Note as seguintes características:
Exemplos:
Código UNICODE: 1010 1001 Em UTF-8 é: 11000010 10101001 = 0xC2 0xA9 Null-terminated UTF-8: 0xC2 0xA9 0x0
Código UNICODE: 0010 0010 0110 0000 Em UTF-8 é: 11100010 10001001 10100000 = 0xE2 0x89 0xA0 Null-terminated UTF-8: 0xE2 0x89 0xA0 0x0
O trabalho consiste em implementar funções utf32to8
e utf8to32
que realizem a transformação entre essas duas representações.
Essas funções devem possuir os seguintes cabeçalhos:
unsigned char *utf32to8 (unsigned char *utf32); unsigned char *utf8to32 (unsigned char *utf8);O string passado como argumento para cada função conterá uma sequência de caracteres naquele código, terminada pelo caracter NULL (0x00) (O código de terminação de um string será 0x00 em UTF8 e 0x00 0x00 0x00 0x00 em UTF32.). No caso do string utf32, os quatro primeiros bytes da string indicam se os valores a seguir estão little-endian ou big-endian. A sequência 0x00 0x00 0xFE 0xFF indica que os caracteres a seguir estão em big-endian. A sequência 0xFF 0xFE 0x00 0x00 indica que os caracteres a seguir estão em little-endian. A saída da função
utf8to32
deve sempre ser little-endian.
Suas funções terão que reservar memória para o vetor de caracteres a ser retornado. Para facilitar, assuma que cada string conterá no máximo 100 caracteres UNICODE.
Para maiores detalhes veja Unicode Home Page, mais especificamente UTF-8, UTF-16, UTF-32 & BOM.
Veja alguns exemplos de conversão aqui.
#include "utfconv.h"para incluir o arquivo
utfconv.h
contendo o cabeçalho das funções.
/* Nome_do_Aluno1 Matrícula1 */ /* Nome_do_Aluno2 Matrícula2 */Isso é fundamental, pois nosso programa de correção vai obter os dados dos membros do grupo a partir desse comentário no código fonte.