Hi-Ansi 文字を同等の Ascii 文字に変換します (é -> e)
-
19-09-2019 - |
質問
Delphi 2007 には、ロケール (コードページ) に従って、ANSI テーブルの上位範囲 (>127) の文字を純粋な ASCII (<=127) の同等の文字に変換するルーチンはありますか?
一部の文字はうまく翻訳できないことはわかっていますが、ほとんどの文字は翻訳できます。192 ~ 255 の範囲:
- À → あ
- à → ある
- Ë → E
- ë → e
- Ç → C
- ç → c
- – (ダッシュ) → - (ハイフン - それはより複雑になる可能性があります)
- — (全角ダッシュ) → - (ハイフン)
解決
WideCharToMultiByte に最もフィットするマッピングを行いますストリッピング発音区別符号を含む指定された文字セットでサポートされていない任意の文字に。あなたはそれを使用してコードページとして20127(US-ASCII)を渡すことによって、正確に何をしたい行うことができます。
function BestFit(const AInput: AnsiString): AnsiString;
const
CodePage = 20127; //20127 = us-ascii
var
WS: WideString;
begin
WS := WideString(AInput);
SetLength(Result, WideCharToMultiByte(CodePage, 0, PWideChar(WS),
Length(WS), nil, 0, nil, nil));
WideCharToMultiByte(CodePage, 0, PWideChar(WS), Length(WS),
PAnsiChar(Result), Length(Result), nil, nil);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(BestFit('aÀàËëÇç–—€¢Š'));
end;
あなたの例で生産するが、私はあなたがいることをしたいなかった場合D.フォーム正規に変換するためのJeroenの提案によって処理されるとは思わないemdashツーマイナスの場合、含めて、あなたが探している結果は、呼び出しアプローチ、マイケル・カプランではなく、明示的にストリッピングについて説明し特殊記号のブログ記事を(持っています)一般的に正規化よりも、それはC#とVistaで導入されたAPIを使用しています。あなたはFoldStringのAPI(任意のWinNTのリリース)を使用して、類似した何かを得ることができます。
あなたが唯一の文字セットのためにこれをやっている、とあなたはWideStringにするから変換するからオーバーヘッドを回避したい場合は、もちろん、Paduはループとルックアップテーブルのためのシンプルなだけのように有効であることが正しいです。
他のヒント
ただ、デルファイ2009クレイグの答えを拡張するには:
あなたは、Delphi 2009以降を使用する場合は、同じ結果とより読みやすいコードを使用することができます:
function OStripAccents(const aStr: String): String;
type
USASCIIString = type AnsiString(20127);//20127 = us ascii
begin
Result := String(USASCIIString(aStr));
end;
残念ながら、このコードは、MS Windows上でのみ動作します。 Macでは、アクセントはベストフィットの文字ではなく疑問符で置き換えられることはありませんされます。
マックのiconvに(はSystem.pasでLocaleCharsFromUnicodeを参照)が使用されているのに対し、もちろん、Delphiは内部でWideCharToMultiByteは、Windows上で使用しています。 異なるOS上でこの異なる振る舞いはバグと見なされ、CodeCentralにに報告すべきか疑問がある。
私はあなたの最善の策は、ルックアップテーブルを作成していると信じています。
あなたが探しているものは、正規化されます。
マイケル・カプランは、正規化について 素敵なブログ記事を書きました。
それはすぐにあなたの問題を解決していませんが、あなたは正しい方向に指してます。
- イェルーン