سؤال

أتساءل عن كيفية تطبيع السلاسل (التي تحتوي على utf-8/utf-16) في C/C++.في .NET هناك وظيفة سلسلة.تطبيع .

لقد استخدمت UTF8-CPP في الماضي ولكنه لا يوفر مثل هذه الوظيفة.وحدة العناية المركزة و Qt يوفران تطبيع السلسلة ولكني أفضل الحلول خفيفة الوزن.

هل هناك أي حل "خفيف الوزن" لهذا؟

هل كانت مفيدة؟

المحلول

كما كتبت في سؤال آخر ، utf8proc مكتبة لطيفة جدًا وخفيفة الوزن لوظائف Unicode الأساسية ، بما في ذلك تسوية سلسلة Unicode.

نصائح أخرى

بالنسبة لنظام التشغيل Windows، يوجد NormalizeString() الوظيفة (لسوء الحظ لنظام التشغيل Vista والإصدارات الأحدث فقط - بقدر ما أرى على MSDN):

http://msdn.microsoft.com/en-us/library/windows/desktop/dd319093%28v=vs.85%29.aspx

إنها أبسط طريقة وجدتها حتى الآن.أعتقد أنها خفيفة الوزن جدًا أيضًا.

int NormalizeString(
    _In_      NORM_FORM NormForm,
    _In_      LPCWSTR   lpSrcString,
    _In_      int       cwSrcLength,
    _Out_opt_ LPWSTR    lpDstString,
    _In_      int       cwDstLength
);

يمكنك إنشاء وحدة العناية المركزة بأدنى حد (أو ربما لا توجد بيانات أخرى - أعتقد أن جميع بيانات التطبيع داخلية الآن) ، ثم الارتباط بشكل ثابت.لم أجرب هذا مؤخرًا ، لكنني أعتقد أن الحجم الإجمالي صغير جدًا في هذه الحالة.

تعني كلمة "خفيف" في سياقك "ذات وظائف محدودة".سأستخدم مصدر وحدة العناية المركزة كمثال ، ومرجع إلى http://unicode.org/reports/tr15/ لتنفيذ هذه الوظيفة "خفيفة الوزن".

حل جيد لـ UTF-8 هو دالة g_utf8_normalize () .قد يتطلب تحويل std :: wstring إلى std :: string (utf16 to utf8) إذا كنت بحاجة إلى هذا من أجل wstring أيضًا (مما سيجعله حلاً مكلفًا للغاية ، ومن ثم أبحث عن حل أفضل ، إن أمكن مع خالصC ++ (11) تعني).

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