Correções no Firebird 2.5 relacionadas ao charset da string de conexão
Autor: Adriano dos Santos Fernandes [email protected]
Data: 2008-12-15
Antes do FB 2.5, os nomes de arquivo usados na string de conexão são sempre passados do cliente para o
servidor sem qualquer conversão. No servidor, esses nomes de arquivo são usados com funções da API do SO sem
qualquer conversão, também. Isso cria a situação em que nomes de arquivo usando caracteres não ASCII não
interoperam bem quando o cliente e o servidor são SOs diferentes ou até mesmo o mesmo SO usando
codepages diferentes.
O problema é resolvido no FB 2.5 da seguinte forma:
O nome de arquivo é considerado, por padrão, como estando no codepage do SO.
Um novo DPB é introduzido, chamado isc_dpb_utf8.filename. Seu significado é alterar a regra acima, para que o FB
considere o nome de arquivo passado como estando em UTF-8.
Se um cliente v2.5 (ou mais novo) estiver se comunicando com um servidor remoto mais antigo que v2.5, e
isc_dpb_utf8.filename foi usado, o cliente converte o nome de arquivo de UTF-8 para o codepage
do cliente e passa esse nome de arquivo para o servidor. O cliente remove o DPB isc_dpb_utf8.filename.
Isso garante compatibilidade retroativa quando as pessoas estão usando o mesmo codepage no cliente e no
SO do servidor.
Se um cliente v2.5 (ou mais novo) estiver se comunicando com um servidor v2.5 (ou mais novo), e
isc_dpb_utf8.filename não foi usado, o cliente converte o nome de arquivo do codepage do SO para
UTF-8 e insere o DPB isc_dpb_utf8.filename. Se isc_dpb_utf8.filename foi usado, o cliente apenas
passa o nome de arquivo original dentro do DPB para o servidor. Então o cliente sempre passa para o servidor
um nome de arquivo em UTF-8 e o DPB isc_dpb_utf8.filename.
O nome de arquivo recebido no servidor está sujeito às mesmas regras acima. Mas observe que o cliente v2.5
pode converter automaticamente o nome de arquivo e inserir o DPB. Clientes mais antigos que v2.5 não fazem isso,
então os nomes de arquivo recebidos serão considerados como estando no codepage do servidor. Novamente garantimos
compatibilidade retroativa quando o codepage do cliente e do servidor são os mesmos.
O codepage do SO e UTF-8 podem não ser a melhor escolha para nomes de arquivo. Por exemplo, se você tiver um
script ISQL (ou de alguma outra ferramenta) e esse script usar outro charset de conexão. Você não poderia
editar corretamente um script (ou qualquer arquivo) usando múltiplos conjuntos de caracteres (codepages). Então agora você pode
codificar qualquer caractere Unicode como caracteres ASCII na string de conexão do nome de arquivo. Isso é
feito usando o símbolo #. Ele é um prefixo para um número de code point Unicode (em formato
hexadecimal, como a notação U+XXXX). Você deve escrevê-lo desta forma: #XXXX com X sendo 0-9, a-f, A-F.
Se você quiser usar o # literal, você pode usar ## ou #0023 (o número do code point para ele).
Esse caractere é interpretado com essa nova semântica no servidor mesmo se o cliente for mais antigo
que v2.5.
O codepage do SO usado para conversões é:
- Windows: A página de código ANSI do Windows
- Outros: UTF-8
Atualizado para 2.5 Beta 2: 2008-07-11
Essas regras agora também são válidas para itens de DPB de string.