[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