سؤال

وسألت سؤالا مماثلا أمس، ولكن ندرك أن أحتاج إلى rephase بطريقة مختلفة.

وباختصار: في C ++ على ويندوز، كيف أفعل تحسس حالة الأحرف البحث عن سلسلة (داخل سلسلة أخرى) عندما السلاسل في شكل يونيكود (شار واسعة، wchar_t)، وأنا لا أعرف لغة السلاسل. أريد فقط أن أعرف ما إذا كانت الإبرة موجودة في كومة قش. موقع الإبرة غير ذي صلة بالنسبة لي.

والخلفية: لدي مستودع يحتوي على الكثير من الهيئات البريد الإلكتروني. كانت الرسائل بلغات مختلفة (اليابانية، الألمانية، الروسية، الفنلندية، سمها ما شئت). جميع البيانات بتنسيق Unicode، وأنا تحميله إلى سلاسل واسعة (wchar_t) في طلبي C ++ (كانت الهيئات MIME فك الشفرة، وذلك في بلدي المصحح أستطيع أن أرى اليابانية الفعلية والشخصيات الألمانية). أنا لا أعرف لغة الرسائل منذ رسائل البريد الإلكتروني doensn't تحتوي على هذا التفصيل، وأيضا هيئة بريد الكتروني واحد قد يحتوي على أحرف من عدة لغات.

وأنا أبحث عن شيء من هذا القبيل wcsstr، ولكن مع القدرة على القيام بالبحث في قضية insensitve الطريقة. وأنا أعلم أنه ليس من الممكن القيام تحويل السليم 100٪ من الحالة العلوي إلى حالة أقل، دون معرفة لغة النص. أريد حلا الذي يعمل في الحالات 99٪ حيث انه من الممكن.

وأنا باستخدام Visual Studio 2008 مع C ++، STL وتفعيل.

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

المحلول

وتعزيز سلسلة الخوارزميات لديه icontains ( ) قالب وظيفة التي قد تفعل ما تريد.

نصائح أخرى

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

ويجب عليك استخدام ICU مكتبة حيث يقدم الدعم لالتعابير العادية يونيكود التي تتبع قواعد يونيكود لمطابقة حالة الأحرف. متاح كما C / C ++ والمكتبات جافا المكتبة. العديد من اللغات الأخرى مثل بايثون تدعم مجمع للمكتبات وحدة العناية المركزة.

هل يمكن تحويل كل إبرة وكومة قش إلى أحرف صغيرة (أو أحرف كبيرة) ثم القيام wcsstr ().

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