[fpc-pascal] fpc 3.0 ansistring codepage behavior

Jonas Maebe jonas.maebe at elis.ugent.be
Fri Mar 4 10:37:46 CET 2016


Seth Grover wrote on Fri, 04 Mar 2016:

> I understand that if I'm doing things "right" with ansistrings, everything
> will work correctly and transparently. However, I worry that there may be
> places in our code where we are doing bad things with ansistrings that may
> be the root of my problem.

"Wrongly" handling ansistrings can only result in invalid data ending  
up in the strings, not in memory corruptions. Well, apart from any  
bugs that may have crept in the RTL routines while adding the code  
page support of course, but those cannot be hidden by just changing  
some settings.

> To identify whether or not this is really the case, is there some way I can
> use the  FPC compiler but have the behavior of ansistrings act like it did
> in fpc 2.6.4?

Yes and no. Yes: if you only use plain ansistrings (or strings in  
{$h+} mode) in your code, the compiler won't generate any code page  
conversions anywhere. Of course, the code in the RTL may still trigger  
some based on the  
http://wiki.freepascal.org/FPC_Unicode_support#Code_page_settings  
settings

No: there is no switch to flip the compiler into a 2.6.4 emulation mode.

> or example, can I do:
>
> SetMultiByteConversionCodePage(CP_NONE);

That will just result in lots of invalid string data.

> or is there some kind of compiler flag I can set in my project? Or even if
> I have to rebuild the compiler itself, can I have the old 2.6.4 ansistring
> behavior in FPC 3.0?

While there is a way to compile the RTL with most of the  
codepage-aware string handling disabled (for bootstrapping with  
2.6.4), the 3.x compiler will always call the string helpers with  
extra codepage-related parameters, so you cannot use an RTL that is  
built like this with FPC 3.x.

> Even if I had to change all of my ansistring declarations to rawbytestring
> I could do that, although that would require me to touch more code and I'd
> prefer to find some sort of flip-a-switch way to do it.

If all of your strings are plain ansistrings (or string in {$h+}  
mode), you program won't (shouldn't) contain any more string code page  
conversions that if you would change everything to rawbytestring.


Jonas



More information about the fpc-pascal mailing list