[fpc-devel] Unicode resourcestrings

Daniël Mantione daniel.mantione at freepascal.org
Sun Mar 2 10:22:32 CET 2008



Op Sun, 2 Mar 2008, schreef Martin Schreiber:

> On Friday 29 February 2008 10.07:29 Daniël Mantione wrote:
>>>
>>> Ideally from my point of view would be if the resourcestrings are stored
>>> in utf-8 if the unit is compiled with -Fcutf8 and decoded by utf8decode
>>> for widestring assignment on runtime independent of the system encoding.
>>
>> This has been discussed before. Automatic conversion to/from ansistrings
>> will always be to/from system encoding. If you want another encoding than
>> the system encoding you will have to do a manual conversion.
>>
>> For the compiler, a resourcestring has the same type as an ansistring, so
>> no distinction can be made between resourcestrings/ansistrings.
>>
> That means that the program must be compiled in the same system encoding as
> the target runs in order to get working resourcestrings? That would
> resourcestrings for i18n purposes render useless apart from utf-8-only or
> latin-1-only. utf-8-only is not possible for older existing installations.

In the traditional way of translating software (from the age when 
resourcestrings were invented) you encode your translation in the encoding 
of the target system. If you do a Dutch translation you could encoude your 
translation in ISO-8859-1 and if you do a Czech translation you could 
encoude the translation in ISO-8859-2.

A more modern approach is to encode all your translations in Unicode and 
convert them to the target encoding. I.e. UTF-8 to system encoding is what 
Lazarus does. There is utf8toansi function in the system unit for this 
purpose. But then you have to call utf82ansi on every resourcestring you 
access, similar to utf8decode if you use widestrings.

> The compiler does not know that the source is a resource string? But the
> compiler could know it, the information is available?

Language wise, resourcestrings are ansistring constants. So whenever you 
use a resourcestring identifier in your code, the compiler considers this 
an expression with type ansistring. Therefore, regarding typing they are 
equal.

Regarding code generation, there is a difference between ansistrings and 
resourcestrings, since with a resourcestring load, the compiler must look 
into the resourcestring tables to find the ansistring constant.

Daniël


More information about the fpc-devel mailing list