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' | 'Ω' | 'クロネコ' |
以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。