先ほどの投稿は動作するのですが、間違っているようです。
どうやら\uxxxxは、ユニコード(21ビット)ではなく、UTF16LEのようです。
そうすると、以下で動作します。
(UMamUnicode.pas ユニットは不要です)
//uses にSystem.RegularExpressions を追加する
//TRegEx.Replaceで使用する関数
function TForm1.MatchReplace2(const m: TMatch): string;
b:TBytes;
begin
//マッチした文字列から先頭2文字\uを削除する
s:=m.Value.Substring(2);
i:=StrToInt('$'+s);//数値に変換
//UTF16LEのバイト配列に変換
SetLength(b,2);
b[1]:=(i and $ff00) shr 8;
b[0]:=i and $ff;
result:=TEncoding.Unicode.GetString(b);
TEncoding.Unicode
end;
procedure TForm1.Button3Click(Sender: TObject);
var st:string;
e:TMatchEvaluator;
begin
//テスト用の適当な文字列
st:='["text":"\u30ea\u30d0\u30fc\u30b9'#13#10' hogehoge"]';
e:=MatchReplace2;//関数を設定
//\uから始まるUnicodeを置換する
st:=TRegEx.Replace(st,'\\u[0-9a-f]{1,4}',e,[]);
showmessage(st);
end;
2023年8月18日金曜日 10:19:32 UTC+9 mam: