On 9/15/18 1:38 AM, Martok wrote: > Hi all, > > concatenating codepage strings is documented to be a bit weird: > <http://wiki.freepascal.org/FPC_Unicode_support#String_concatenations> > > Knowing this, how does one achieve the following? > > - have a string in any dynamic codepage > - append another string (possibly from different CP), or a literal > - have the result in the same dynamic codepage as before > > Literally, "transcode the new part and plop it at the end"? > > Using AnsiStrings does not work, as the declared CP is CP_ACP, which is not > the > dynamic CP, and loss of data is likely. Using RawByteStrings does not work, as > they get converted to CP_ACP regardless of their current dynamic CP, and loss > of > data is likely. Insert() does not work, because it doesn't care about > characters > at all and just moves bytes. > > Doing the entire thing manually with a temp string does work, but such a > simple > task can't be that difficult, can it?
Safest and cleanest would probably be something like this: === code begin === function ConcatWithCP(const aLeft, aRight: RawByteString; aCP: LongInt): RawByteString; inline; begin Result := aLeft; SetCodePage(Result, CP_UTF8, True); Result := Result + aRight; SetCodePage(Result, aCP, True); end; === code end === (alternatively with an array of RawByteString to concatenate multiple strings at once) Regards, Sven _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal