سؤال

هل هناك روتين متوفر في Delphi 2007 لتحويل الأحرف في مجموعة عالية من جدول ANSI (> 127) إلى ما يعادلها في ASCII النقي (<= 127) وفقا ل Locale (Coodepage)؟

أعرف أن بعض الأحرف لا يمكن أن تترجم بشكل جيد ولكن معظمها، esp. في نطاق 192-255:

  • Àأ
  • àأ
  • Ëهيا
  • ëهيا
  • Çجيم
  • çجيم
  • (en 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 للتحويل إلى نموذج التطبيع D. إذا كنت ترغب في اتخاذ هذا النهج، مايكل كابلان لديه أ مشاركة مدونة يناقش صراحة التعرية من الدروع (بدلا من التطبيع بشكل عام)، ولكنه يستخدم C # و API الذي كان يقدم في نظام التشغيل Vista. يمكنك الحصول على شيء مماثل باستخدام API FoldString (أي إصدار Winnt).

بالطبع إذا كنت تقوم بهذا فقط من أجل مجموعة أحرف واحدة، وترغب في تجنب التحويلات العامة من التحويلات من وإلى اللياقة، فإن Padu صحيحة بحيث تكون بسيطة للحلقة وجدول البحث فعال.

نصائح أخرى

فقط لتوسيع إجابة Craig ل Delphi 2009:

إذا كنت تستخدم 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، لا يتم استبدال اللجهات بأحرف أحواض جاهزة ولكنها علامات استفهام.

من الواضح أن دلفي يستخدم Widechultibyte Widechartomultibyte على Windows بينما يتم استخدام Iconv في Mac (انظر LocaleCharSFromunicode في System.Pas). السؤال هو إذا كان هذا السلوك المختلف على نظام التشغيل المختلفة، يجب اعتباره علة وأبلغ عن ترميز الترميز.

أعتقد أن أفضل رهان يخلق طاولة بحث.

ما تبحث عنه هو التطبيع.

كتب مايكل كابلان مقال بلوق لطيف حول التطبيع.

لا يحل مشكلتك على الفور، ولكن يشيرك في الاتجاه الصحيح.

-

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top