INF1612 - Software Básico - 2006.1

Trabalho 1: Codificação UTF

Descrição do Trabalho

  1. Codificação UTF:

    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:

    1. Caracter U+00A9 (sinal de copyright):
      Código UNICODE: 1010 1001 
      Em UTF-8 é: 11000010 10101001 = 0xC2 0xA9 
      Null-terminated UTF-8: 0xC2 0xA9 0x0
      
    2. Caracter U+2260 (sinal de diferente):
      Código UNICODE: 0010 0010 0110 0000 
      Em UTF-8 é: 11100010 10001001 10100000 = 0xE2 0x89 0xA0
      Null-terminated UTF-8: 0xE2 0x89 0xA0 0x0
      
  2. O que deve ser feito:

    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.

Data de Entrega

O trabalho deve ser entregue no dia 2 de maio.

Observações importantes