Luiz Americo Pereira Camara schrieb:
On 17/9/2011 11:46, Hans-Peter Diettrich wrote:
Luiz Americo Pereira Camara schrieb:

The codepage of a RawByteString at runtime will keep the previous CodePage (65001 for UTF8, 1200 for UTF16) as opposed to change to the RawbyteString CodePage (65535) as a though previously

Delphi defines RawByteString=AnsiString, so there is no room for UTF-16 in such an string.

No. I was wrong. See Florian email. RawByteString will keep the codepage (1200 = UTF16) and the data of the assigned string be UTF8, be UTF8.


So the implementation would be:

function FileGetAttr(const FileName: RawByteString): Longint;
begin
SetCodePage(FileName, 1200, True);

Won't work, because of "const",

Yes

and because UTF-16 is not a Byte (AnsiChar) string :-(

No. See above. Look in net for Delphi and Unicode doc by marco cantu

Can you give me a link? I checked the XE documentation and RTL, and could not find that RawByteString can hold UTF-16, and my test confirms that:

var
  a: AnsiString;
  u: UnicodeString;

procedure test(r: RawByteString; cp: word);
begin
WriteLn('in: ', StringElementSize(r), ' cp: ', StringCodePage(r), ' len=', length(r));
  WriteLn('"', r, '"'); //writes garbage for non-OEM chars, of course
  SetCodePage(r, cp, true);
WriteLn('out: ', StringElementSize(r), ' cp: ', StringCodePage(r), ' len=', length(r));
  a := r; //use the result, so that nothing can be optimized away
  WriteLn('"', r, '"');
end;

This reveals the following behaviour:

1) UnicodeString is converted to AnsiString, before passed to test.
2) Setting codepage to 1200 doesn't change anything.
3) Conversion to UTF-8 seems to work (length changed).
4) Conversion from UTF-8 to Ansi results in an empty string.

I'll ask in an Embarcadero group, in detail for [4].

DoDi

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to