Note that if you do not use Lazarus (As you stated) but only FPC, you can use {$mode delphiunicode} and char would be unicodechar. But that is by no means single byte, mostly double byte (the ucs2 part) and possibly - again - 4 bytes.
This mode will make your life easier, though.
This example covers technically UCS2, but that is an ancestor to current unicode16 and a 4 byte unicodechar is not implemented as such:
program size;
{$mode delphiunicode}
begin
writeln(SizeOf(Char));
end.
In an ideal world it should return 4, imho.
OTOH this was defined
before the unicode extensions in the standard and fpc can handle the 4 case as well. Just like Delphi.
That does mean you still have to reserve 4 bytes per UnicodeChar, not two as per my example.