Delphi 2007中是否有可用于根据语言环境(代码页)将ANSI表(> 127)的高范围内的字符转换为纯ASCII(< = 127)中的等效数据的例程? 我知道一些字符不能很好的翻译,但大多数可以,尤其是。在192-255范围内:
>À→A
>à→a
Ë→E
ë→e
Ç→C
>ç→c
> – (en dash)→ – (连字号 – 可能会更棘手)
> – (em dash)→ – (连字符)
>À→A
>à→a
Ë→E
ë→e
Ç→C
>ç→c
> – (en dash)→ – (连字号 – 可能会更棘手)
> – (em dash)→ – (连字符)
解决方法
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,PWideChar(WS),Length(WS),nil,nil)); WideCharToMultiByte(CodePage,PAnsiChar(Result),Length(Result),nil); end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(BestFit('aÀàËëÇç–—€¢Š')); end;
用你的例子来调用它会产生你正在寻找的结果,包括emdash-to-case,我不认为是由Jeroen的建议转换为Normalization表格D.如果你想采取这种方法,Michael Kaplan有一个blog post,它明确地讨论了剥离变音符号(而不是一般的标准化),但是它使用了C#和在Vista中引入的API。您可以使用FoldString api(任何WinNT版本)获得类似的东西。
当然,如果你只是为一个字符集做这个,而你想避免从WideString转换到开销,Padu是正确的,一个简单的for循环和一个查找表将是一样有效。