WideCharToMultiByte không lập bản đồ phù hợp nhất đối với bất kỳ ký tự không được hỗ trợ bởi bộ ký tự quy định, bao gồm cả dấu tước. Bạn có thể thực hiện chính xác những gì bạn muốn bằng cách sử dụng và chuyển 20127 (US-ASCII) làm mã.
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;
Calling rằng với các ví dụ của bạn tạo ra kết quả mà bạn đang tìm kiếm, bao gồm cả emdash-to-trừ trường hợp, mà tôi không nghĩ được xử lý bởi gợi ý Jeroen để chuyển đổi sang hình thức Normalization D. Nếu bạn đã làm muốn có cách tiếp cận đó, Michael Kaplan có một số blog post thảo luận rõ ràng về việc bỏ dấu phụ (thay vì bình thường hóa nói chung), nhưng nó sử dụng C# và một API được giới thiệu trong Vista. Bạn có thể nhận được một cái gì đó tương tự bằng cách sử dụng api FoldString (bất kỳ phiên bản WinNT). Tất nhiên nếu bạn chỉ làm điều này cho một bộ ký tự, và bạn muốn tránh chi phí từ việc chuyển đổi đến và từ một WideString, Padu là chính xác rằng một vòng lặp đơn giản và một bảng tra cứu sẽ chỉ có hiệu quả .
Nguồn
2009-12-12 05:33:34
Cảm ơn Craig. Đó là một giải pháp chung chung hơn so với tra cứu. Nó có một lỗi đánh máy trong số ma thuật, vì vậy tôi đã sửa nó và sử dụng một hằng số thay thế. Nhưng dù sao, nó hoạt động trên D2007 cũng như D2009. –
Một điều chúng tôi nhận thấy với điều này, là 'β' (unicode 1E9E chữ cái latin sharp s) không được chuyển đổi, vì vậy chúng tôi làm điều này trước: StringReplace (aStr, 'β', 'SS', [rfReplaceAll]) – PatrickvL