Oplossingen in Firebird 2.5 met betrekking tot de charset van de verbindingsreeks
Auteur: Adriano dos Santos Fernandes [email protected]
Datum: 2008-12-15
Vóór FB 2.5 werden bestandsnamen die in de verbindingsreeks worden gebruikt altijd zonder enige conversie van de client naar de
server doorgegeven. Op de server worden die bestandsnamen ook zonder enige conversie
gebruikt met OS API-functies. Dit creëert de situatie waarin bestandsnamen met niet-ASCII-tekens niet
goed interoperabel zijn wanneer de client en de server verschillende besturingssystemen zijn, of zelfs hetzelfde besturingssysteem met verschillende
codepagina’s.
Het probleem wordt in FB 2.5 op de volgende manier aangepakt:
De bestandsnaam wordt standaard beschouwd als zijnde op de OS-codepagina.
Er wordt een nieuwe DPB geïntroduceerd, genaamd isc_dpb_utf8.filename. De betekenis hiervan is om de bovenstaande regel te wijzigen, zodat FB
de doorgegeven bestandsnaam als UTF-8 moet beschouwen.
Als een v2.5 (of nieuwere) client communiceert met een externe server ouder dan v2.5, en isc_dpb_utf8.filename werd gebruikt, converteert de client de bestandsnaam van UTF-8 naar de clientcodepagina en geeft die bestandsnaam door aan de server. De client verwijdert de isc_dpb_utf8.filename DPB.
Dit garandeert achterwaartse compatibiliteit wanneer mensen dezelfde codepagina op de client- en server-OS gebruiken.
Als een v2.5 (of nieuwere) client communiceert met een v2.5 (of nieuwere) server, en isc_dpb_utf8.filename werd niet gebruikt, converteert de client de bestandsnaam van de OS-codepagina naar UTF-8 en voegt de isc_dpb_utf8.filename DPB in. Als isc_dpb_utf8.filename werd gebruikt, geeft de client gewoon de originele bestandsnaam binnen de DPB door aan de server. De client geeft dus altijd een UTF-8-bestandsnaam en de isc_dpb_utf8.filename DPB door aan de server.
De bestandsnaam die op de server wordt ontvangen is onderworpen aan dezelfde regels als hierboven. Maar let op: een v2.5-client kan de bestandsnaam automatisch converteren en de DPB invoegen. Clients ouder dan v2.5 doen dat niet, dus de ontvangen bestandsnamen worden beschouwd als zijnde op de servercodepagina. We garanderen opnieuw achterwaartse compatibiliteit wanneer client- en servercodepagina hetzelfde zijn.
De OS-codepagina en UTF-8 zijn mogelijk niet de beste keuze voor bestandsnamen. Als u bijvoorbeeld een ISQL-script (of een ander hulpmiddel) had en dat script gebruikt een andere verbindingskarakterset. U zou niet correct een script (of een ander bestand) kunnen bewerken met meerdere tekensets (codepagina’s). U kunt nu dus elk Unicode-teken als ASCII-tekens coderen in de bestandsnaam van de verbindingsreeks. Dat wordt bereikt met behulp van het symbool #. Het is een voorvoegsel voor een Unicode-codepuntnummer (in hexadecimaal formaat, zoals U+XXXX-notatie). U moet het op deze manier schrijven: #XXXX met X zijnde 0-9, a-f, A-F.
Als u het letterlijke # wilt gebruiken, kunt u ## of #0023 (het codepuntnummer ervoor) gebruiken.
Dat teken wordt met deze nieuwe semantiek op de server geïnterpreteerd, zelfs als de client ouder is dan v2.5.
De OS-codepagina die voor conversies wordt gebruikt is:
- Windows: De Windows ANSI-codepagina
- Overige: UTF-8
Bijgewerkt voor 2.5 Beta 2: 2008-07-11
Deze regels zijn nu ook geldig voor string-DPB-items.