文字列の型判定は可能でしょうか

解決


monkey  2023-07-25 02:32:51  No: 151038  IP: 192.*.*.*

String型で渡された変数がUnicodeStringなのかAnsiStringなのかを判定することは可能でしょうか。

編集 削除
take  2023-07-25 03:14:30  No: 151039  IP: 192.*.*.*

GoogleのAIサービスBardでこんな回答が来ました
使えそうでしょうか?

var
  StringType: TType;
begin
  StringType := GetType(MyString);
  if StringType = TType.AnsiString then
  begin
    // MyString is an AnsiString
  end else if StringType = TType.UnicodeString then
  begin
    // MyString is a UnicodeString
  end;
end;

編集 削除
AAAAA  2023-07-25 07:12:30  No: 151040  IP: 192.*.*.*

型自動変換されるから無理じゃない?

編集 削除
HFUKUSHI  2023-07-25 11:35:17  No: 151041  IP: 192.*.*.*

Delphi 2009以降だとString型はUnicodeString型のエイリアスなので、質問は
| UnideString型で渡された変数がUnicodeStringなのかAnsiStringなのかを判定する
ということになってしまい、意味を成しませんよね?

たとえば
procedure Foo(const S: AnsiString); overload;
procedure Foo(const S: UnicodeString); overload;
とすると、
var
  S1: AnsiString;
  S2: UnicodeString;
begin
  Foo(S1);  // AnsiString版が呼ばれる
  Foo(S2);  // UnicodeString版が呼ばれる
とか、こういうことですか?もう少し具体的にやりたいこと、困った状況を説明してもらえると回答が付きやすいかと思います。

編集 削除
monkey  2023-07-26 07:31:18  No: 151042  IP: 192.*.*.*

情報不足ですみませんでした。
Delphi6環境からDelphi10.3環境への載せ替え作業で
Length関数の戻り値がバイト数から桁数に変わることへの対応で
バイト数を戻す関数を作ってLength関数を置換しようとしているのですが
中にはLength(WideString(aaa))のように桁数を取得している箇所もあるため
バイト数を戻す関数内で引数がどちらか判定できればと考えております。

編集 削除
take  2023-07-26 07:55:53  No: 151043  IP: 192.*.*.*

そのアプリの移行で文字コードをどうするのかの方針によって答えが変わってきます

1.引き続きAnsiStringを使いたい(制御系アプリのため)
2.Delphi10の形式に移行したい

1だと変数も命令も全部AnsiStringを使えば動きます

2だと公式に助言があります
https://www.embarcadero.com/images/jp/dm/technical-papers/delphi_unicode_wp_jp.pdf

編集 削除
Mr.XRAY  2023-07-26 09:41:50  No: 151044  IP: 192.*.*.*

> String型で渡された変数がUnicodeStringなのかAnsiStringなのかを判定することは可能でしょうか。

できません.
引数の変数に渡すということは,その型の変数に代入するのと同じです.
文字列に限らず,代入後の変数には,元の型の情報はありません.

Delphi 2009 以降の String ( UniCodeString) 型のハイト数を取得するには
例えば ByteLength 関数を使用できます.      

編集 削除
AAAAA  2023-07-26 15:59:32  No: 151045  IP: 192.*.*.*

function Length(Value: String): Integer; overload;
begin
    RESULT := System.Length(Value) * 2;
end;

おすすめはしなけど
これ追加しておけばソース変えないで WideString も AnsiString と同じになる

編集 削除
monkey  2023-08-02 00:50:09  No: 151057  IP: 192.*.*.*

皆様ご助言ありがとうございました。

編集 削除