UTF-8のソースコードに文字列定数を書いたらそのままUTF-8になったお話

program test;

uses
  Windows;

begin
  WriteLn(lstrlenW('あ'));  { 3 }
end.

と書いたら3が返ってきて、びっくりですよ。
ソースコードUTF-8だからUTF-8で定数が保存されたのでしょうか。

program test;

uses
  Windows;

begin
  WriteLn(lstrlenW(#$3042));  { 1 }
end.

でちゃんと1が返ってきました。


追記:
ソースコードが、じゃなくてそもそも内部ではUTF-8を使ってるんでした。
多分それのせいかと。なので文字列定数に対してUTF8Decodeとか使えばUTF-16として戻ってくるはず。


追記2:

program test;

{$MODE OBJFPC}

uses
  Windows;

var
  s: WideString;
begin
  s := UTF8Decode('あ');
  Writeln(lstrlenW(s)); { 1 }
end.

うーむ……