delphi - 将 Hi-Ansi 字符转换为等效的 Ascii 字符 (é -> e)

标签 delphi character-encoding ascii delphi-2007 non-ascii-characters

Delphi 2007 中是否有一个例程可以根据区域设置(代码页)将 ANSI 表高位范围 (>127) 中的字符转换为纯 ASCII (<=127) 中的等效字符?

我知道有些字符不能很好地翻译,但大多数可以,尤其是。在 192-255 范围内:

  • ÀA
  • àa
  • Ë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;

用你的例子调用它会产生你正在寻找的结果,包括 emdash-to-minus 情况,我认为 Jeroen 的建议不能处理这种情况,转换为规范化形式 D。如果你确实想采取这种方式方法,迈克尔卡普兰有一个blog post明确讨论了剥离变音符号(而不是一般的标准化),但它使用 C# 和 Vista 中引入的 API。您可以使用 FoldString api(任何 WinNT 版本)获得类似的东西。

当然,如果您只对一种字符集执行此操作,并且您希望避免与 WideString 之间的转换产生的开销,那么 Padu 是正确的,简单的 for 循环和查找表也同样有效。

关于delphi - 将 Hi-Ansi 字符转换为等效的 Ascii 字符 (é -> e),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3084905/

相关文章:

c# - AES 解密在中文语言环境中失败,出现无效字符错误

c++ - C标准: Character set and string encoding specification

unicode - ASCII 和 Unicode 有什么区别?

java - 在转换 ascii 数据时感到困惑

Delphi 对象类型转换

python-2.7 - 如何在 Python 2.x 中获取系统默认编码?

DELPHI 10.3社区版在哪里添加公共(public)库路径

list - Erlang:如何避免列表被翻译成 ASCII 字符串?

delphi - 我可以将 Base 接口(interface)类型强制转换为 Derived 接口(interface)类型吗?

delphi - 为什么不调用 Destroy?