代码之家  ›  专栏  ›  技术社区  ›  Francesca

将hi-ansi字符转换为等价的ascii字符(_->e)

  •  22
  • Francesca  · 技术社区  · 16 年前

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

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

    • γ 艾斯
    • γ 艾斯
    • γ 艾斯 e
    • γ 艾斯 E
    • γ 艾斯 C
    • 艾斯 C
    • 艾斯 (短跑) _ - (连字符-可能更复杂)
    • 艾斯 (短跑) 艾斯 - (连字符)
    4 回复  |  直到 10 年前
        1
  •  28
  •   Community Mohan Dere    11 年前

    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。如果你确实想采用这种方法,Michael Kaplan有一个 blog post 显式讨论了剥离音调符号(而不是一般的规范化),但它使用了C和在Vista中引入的API。您可以使用foldstring API(任何Winnt版本)获得类似的内容。

    当然,如果您只对一个字符集执行此操作,并且希望避免从宽字符串转换到宽字符串和从宽字符串转换到宽字符串的开销,那么padu正确地认为简单的for循环和查找表也同样有效。

        2
  •  7
  •   oxo    12 年前

    为了延长克雷格对Delphi2009的回答:

    如果使用Delphi2009和更新版本,则可以使用具有相同结果的更可读代码:

    function OStripAccents(const aStr: String): String;
    type
      USASCIIString = type AnsiString(20127);//20127 = us ascii
    begin
      Result := String(USASCIIString(aStr));
    end;
    

    不幸的是,此代码仅在MS Windows上有效。在Mac电脑上,重音符号不是用最合适的字符代替,而是用问号代替。

    显然,Delphi内部在Windows上使用了WideChartoMultiByte,而在Mac上则使用了Iconv(请参见system.pas中的localeCharsfromUnicode)。 问题是,不同操作系统上的这种不同行为是否应被视为bug并报告给codeCentral。

        3
  •  3
  •   Padu Merloti    16 年前

    我相信你最好的选择是创建一个查阅表格。

        4
  •  1
  •   Community Mohan Dere    11 年前

    您要寻找的是规范化。

    迈克尔·卡普兰写了一篇 nice blog article about normalization .

    它不会立即解决你的问题,但会给你指明正确的方向。

    ——杰罗恩