記事カテゴリ

ユーザー機能


 2024年2月28日(水) 07:24 JST

[Delphi] 大文字・小文字変換の関数(Delphi)

  • 投稿者:
  • 表示回数
    14,380

⚠⚠⚠ 注意!:この記事はUnicode対応する前のDelphiが対象です。⚠⚠⚠

TEditのCharCaseプロパティ、AnsiUpperCase/AnsiLowerCase についてDBCSはその処理の対象外であると思いこんでいたが、的がはずれて結構時間を費やしてしまったので備忘録としてまとめておく。
ちなみに、MBCS(DBCS)対応でSBCSのアルファベット(ASCII)部分のみ変換する関数は、Ansi~FileName関数であった。
TEditのCharCaseプロパティには、そのような動作を指定できる値がないため、別途KeyPressなどで処理をする必要がある

procedure TfrmXXXXX.InplaceEditorKeyPress(Sender: TObject; var Key: Char);
begin
  // 小文字→大文字変換例
  if Key in ['a'..'z'] then Key := Char(Ord(Key)-$20);
end;

小文字→大文字変換

アルファベットの大文字・小文字を変換する関数についてまとめておく。まず、小文字を大文字に変換する方から。

関数変換の結果
引数の型ロケールの影響関数名'abc'
(1Byte)
'abc'
(2Byte)
'ω''クロネコ'
PChar なし StrUpper 'ABC' 'abc' 'ω' 'クロキコ'
あり AnsiStrUpper 'ABC' 'ABC' 'Ω' 'クロネコ'
string なし UpperCase 'ABC' 'abc' 'ω' 'クロキコ'
あり AnsiUpperCase 'ABC' 'ABC' 'Ω' 'クロネコ'
AnsiUpperCaseFileName 'ABC' 'abc' 'ω' 'クロネコ'

2Byteカタカナや漢字の一部は、そのTrailByte(2Byte目)がSingleByte(英小文字1Byte目)の範囲にあるため、StrUpper や UpperCase を使うと文字化けを起こす。それを避けるには AnsiStrUpper などを使う。これは、ギリシャ文字やロシア文字についても正しく変換を行う。

大文字→小文字変換

続いて、大文字を小文字に変換する方もまとめておく。

関数変換の結果
引数の型ロケールの影響関数名'ABC'
(1Byte)
'ABC'
(2Byte)
'Ω''クロネコ'
PChar なし StrLower 'abc' 'ABC' 'Ω' 'ハロネビ'
あり AnsiStrLower 'abc' 'abc' 'ω' 'クロネコ'
string なし LowerCase 'abc' 'ABC' 'Ω' 'ハロネビ'
あり AnsiLowerCase 'abc' 'abc' 'ω' 'クロネコ'
AnsiLowerCaseFileName 'abc' 'ABC' 'Ω' 'クロネコ'

2Byte文字を含む文字列に対して StrLower や LowerCase を使うと、先と同様の理由で文字化けを起こす場合がある。このためAnsiStrLower など、2Byte文字に対応している関数を使用する。

※Unicode版DelphiでPWideString,WideStringにて動作確認してみたら、上記の結果と異なりUpperCase、LowerCaseが正しく動作することを確認できた。
ただし、PAnsiString,AnsiStringに対しては従来通りだった。

小文字→大文字(PWideChar/WideString)

関数変換の結果
引数の型ロケールの影響関数名'abc'
(1Byte)
'abc'
(2Byte)
'ω''クロネコ'
PWideChar なし StrUpper 'ABC' 'abc' 'ω' 'クロネコ'
あり AnsiStrUpper 'ABC' 'ABC' 'Ω' 'クロネコ'
string
(WideString)
なし UpperCase 'ABC' 'abc' 'ω' 'クロネコ'
あり AnsiUpperCase 'ABC' 'ABC' 'Ω' 'クロネコ'
AnsiUpperCaseFileName 'ABC' 'abc' 'ω' 'クロネコ'

大文字→小文字(PWideChar/WideString)

関数変換の結果
引数の型ロケールの影響関数名'ABC'
(1Byte)
'ABC'
(2Byte)
'Ω''クロネコ'
PWideChar なし StrLower 'abc' 'ABC' 'Ω' 'クロネコ'
あり AnsiStrLower 'abc' 'abc' 'ω' 'クロネコ'
string
(WideString)
なし LowerCase 'abc' 'ABC' 'Ω' 'クロネコ'
あり AnsiLowerCase 'abc' 'abc' 'ω' 'クロネコ'
AnsiLowerCaseFileName 'abc' 'ABC' 'Ω' 'クロネコ'

トラックバック

このエントリのトラックバックURL:
https://www.blackcat.xyz/trackback.php/ProgramingFAQ_del0066

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。