문제

Delphi 2007에서 Locale (Codepage)에 따라 ANSI 테이블의 높은 범위 (> 127)의 캐릭터를 순수한 ASCII (<= 127)의 등가물로 변환하기 위해 일상적인 일이 있습니까?

나는 일부 숯이 잘 번역 할 수 없지만 대부분은 할 수 있다는 것을 알고 있습니다. 192-255 범위에서 :

  • À
  • à
  • Ë이자형
  • ë이자형
  • Ç
  • ç
  • (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, 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의 정규화 양식으로 전환하겠다는 제안에 의해 처리되지 않는다고 생각합니다. Kaplan은 a 블로그 게시물 명시 적으로 명시 적으로 논의된다 (일반적으로 정규화가 아닌)은 C#과 Vista에서 도입 된 API를 사용합니다. Foldstring API (모든 Winnt 릴리스)를 사용하여 비슷한 것을 얻을 수 있습니다.

물론 하나의 캐릭터 세트에 대해서만이 작업을 수행하고 오버 헤드가 넓은 곳으로 변환되는 것을 피하려면 PADU는 루프와 조회 테이블의 간단한 것이 효과적이라는 것이 정확합니다.

다른 팁

Delphi 2009에 대한 Craig의 답변을 확장하기 위해 :

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에서 악센트는 가장 잘 맞는 캐릭터가 아니라 물음표로 대체됩니다.

분명히 Delphi는 내부적으로 Windows에서 WideChartomultibyte를 사용하는 반면 Mac Iconv에서는 사용됩니다 (System.pas의 LocalEcharsfromunicode 참조). 문제는 다른 OS 에서이 다른 동작이 버그로 간주되어 CodeCentral에보고되어야하는지입니다.

최선의 방법은 조회 테이블을 만드는 것이라고 생각합니다.

당신이 찾고있는 것은 정규화입니다.

마이클 카플란은 a 정규화에 관한 멋진 블로그 기사.

그것은 즉시 당신의 문제를 해결하지는 않지만 올바른 방향을 가리 킵니다.

-jeroen

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top