كيفية إزالة هذا النوع من الرموز (غير المرغوب فيه) من السلسلة؟

StackOverflow https://stackoverflow.com/questions/72677

  •  09-06-2019
  •  | 
  •  

سؤال

تخيل أن لدي سلسلة في C#:"أنا لا أراك .."

أريد إزالة (استبدال لا شيء أو ما إلى ذلك) هذه الرموز "".

كيف أقوم بهذا العمل؟

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

المحلول

تبدو هذه "الرسائل غير المرغوب فيها" وكأنها شخص ما قام بتفسير بيانات UTF-8 على أنها ISO 8859-1 أو Windows-1252، وربما بشكل متكرر.

هو التسلسل C3 A2، E2 82 AC، E2 84 A2.

  • UTF-8 C3 A2 = U+00E2 = â
  • UTF-8 E2 82 AC = U+20AC = €
  • UTF-8 E2 84 A2 = U+2122 = ™

ثم نقوم بذلك مرة أخرى:في نظام التشغيل Windows 1252، يكون هذا التسلسل هو E2 80 99، لذا يجب أن يكون الحرف U+2019، علامة الاقتباس المفردة اليمنى (')

يمكنك إجراء تمريرات متعددة باستخدام صفائف البايت، Encoding.UTF8 وEncoding.GetEncoding(1252) لإعادة الملفات غير المرغوب فيها بشكل صحيح إلى ما تم إدخاله في الأصل.ستحتاج إلى التحقق من معالجتك للعثور على المكانين اللذين تم تفسير بيانات UTF-8 بشكل غير صحيح على أنهما Windows-1252.

نصائح أخرى

"I Don’t see ya..".Replace( "’", string.Empty);

كيف وصلت تلك الخردة إلى هناك في المقام الأول؟هذا هو السؤال الحقيقي.

من خلال إزالة أي حرف غير لاتيني، فإنك بذلك تتعمد كسر بعض دعم التدويل.

لا تنسوا الرجل الفقير الذي اسمه "â" فيه.

يبدو هذا مألوفًا بشكل مثير للقلق بالنسبة لمشكلة ترميز الأحرف التي تتعامل مع مجموعة أحرف Windows المخزنة في قاعدة بيانات باستخدام ترميز الأحرف القياسي.أرى شخصًا صوت لصالح ويل، لكن لديه وجهة نظر معينة.ربما تقوم بحل المشكلة المباشرة، ولكن مجموعات الشخصيات لا حدود لها إذا كانت هذه هي المشكلة.

إذا كان عليك فعل ذلك، فمن المحتمل أن تكون التعبيرات العادية هي الحل الأفضل.

أوصي بشدة أن تفكر في سبب قيامك بذلك، على الرغم من ذلك - على الأقل بعض الأحرف التي قمت بإدراجها على أنها غير مرغوب فيها تكون صالحة تمامًا ومفيدة في اللغات الأخرى، ومجرد تصفيتها من المرجح أن يزعج بعضًا من شخصياتك على الأقل. المستخدمين الدوليين.كسويد، لا أستطيع أن أؤكد بما فيه الكفاية كم أنا يكره الأنظمة التي لا يمكنها التعامل مع أحرف å وä وö بشكل صحيح.

فكر في Regex.Replace(your_string, regex, "") - هذا ما أستخدمه.

اختبر كل حرف على حدة لمعرفة ما إذا كان حرفًا أبجديًا أو رقميًا صالحًا، وإذا لم يكن كذلك، فقم بإزالته من السلسلة.اختبار الشخصية بسيط جدًا، ما عليك سوى استخدام...

char.IsLetterOrDigit;

من فضلك هناك العديد من الآخرين مثل ...

char.IsSymbol;
char.IsControl;

Regex.Replace("السلسلة"، "[^a-zA-Z ]"،"")؛

هذه هي الطريقة التي ستفعل بها ذلك في لغة C#، على الرغم من أن هذا التعبير العادي ([^a-zA-Z]) يجب أن يعمل في معظم اللغات.

[تم التعديل:نسيت المساحة في regex]

سيكون رمز ASCII / Integer لهذه الأحرف خارج النطاقات الأبجدية العادية.البحث عن الأحرف الفارغة واستبدالها.السلسلة لديها طريقة استبدال على ما أعتقد.

إما أن تستخدم قائمة سوداء بالأشياء التي لا تريدها، أو يفضل أن تكون قائمة بيضاء (مجموعة).باستخدام القائمة البيضاء، يمكنك التكرار عبر السلسلة ونسخ الأحرف الموجودة في القائمة البيضاء فقط إلى السلسلة الناتجة.لقد قلت إزالة، والطريقة التي تفعل بها ذلك هي وجود مؤشرين، أحدهما تقرأ من (R) والآخر تكتب إليه (W):

I Donââ‚
     W  R

إذا كانت الفاصلة موجودة في قائمتك البيضاء، فعليك في هذه الحالة أن تقرأ الفاصلة وتكتبها في مكان Á ثم تقدم كلا المؤشرين.UTF-8 هو ترميز متعدد البايت، لذا فإن تقدم المؤشر قد لا يكون مجرد إضافة إلى العنوان.

مع C، هناك طريقة سهلة للحصول على قائمة بيضاء باستخدام إحدى الوظائف المحددة مسبقًا (أو وحدات الماكرو):isalnum، isalpha، isascii، isblank، iscntrl، isdigit، isgraph، islower، isprint، ispunct، isspace، isupper، isxdigit.في هذه الحالة تقوم بإرسال وظيفة القائمة البيضاء بدلاً من مجموعة بالطبع.

عادةً عندما أرى بيانات مثل تلك التي لديك، أبحث عن تلف في الذاكرة، أو دليل يشير إلى أن التشفير الذي أتوقعه يختلف عن الذي تم إدخال البيانات به.

/ آلان

لقد واجهت نفس المشكلة مع النفايات الدخيلة التي تم إلقاؤها بواسطة Adobe في ملف تفريغ EXIF.لقد أمضيت ساعة في البحث عن إجابة مباشرة وتجربة العديد من الاقتراحات غير الناضجة التي لم تنجح هنا.

كان هذا الموضوع أكثر من أي موضوع قرأته مليئًا بأسئلة عميقة ودقيقة مثل "كيف وصل الأمر إلى هناك؟"، "ماذا لو كان لدى شخص ما هذه الشخصية في اسمه؟"، "هل أنت متأكد من أنك تريد كسر التدويل؟".

كانت هناك بعض العروض الرائعة لسعة الاطلاع التي تفترض كيف يمكن أن تصل هذه النفايات إلى هنا وتشرح تطور مخططات ترميز الأحرف المختلفة.أراد الشخص معرفة كيفية إزالته، وليس كيف أصبح أو ما هي المعايير التي تطبقها المنظمات، رغم أن هذه المعلومات التافهة قد تكون مثيرة للاهتمام.

لقد كتبت برنامجًا صغيرًا أعطاني الإجابة الصحيحة.بدلاً من إعادة صياغة المفهوم الرئيسي، إليك البرنامج الكامل والمستقل والعمل (على الأقل في نظامي) والمخرجات التي استخدمتها لتدمير النفايات النووية:

#!/usr/local/bin/perl -w

# This runs in a dos window and shows the char, integer and hex values
# for the weird chars. Install the HEX values in the REGEXP below until
# the final test line looks normal. 
$str = 's: “Brian';  # Nuke the 3 werid chars in front of Brian.
@str = split(//, $str);
printf("len str '$str' = %d, scalar \@str = %d\n", 
    length $str, scalar @str);
$ii = -1;
foreach $c (@str)  {
   $ii++;
   printf("$ii) char '$c', ord=%03d, hex='%s'\n", 
       ord($c), unpack("H*", $c));
}
# Take the hex characters shown above, plug them into the below regexp
# until the junk disappears!
($s2 = $str) =~ s/[\xE2\x80\x9C]//g;  # << Insert HEX values HERE
print("S2=>$s2<\n");  # Final test

Result:
M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl
len str 's: GÇ£Brian' = 11, scalar @str = 11
0) char 's', ord=115, hex='73'
1) char ':', ord=058, hex='3a'
2) char ' ', ord=032, hex='20'
3) char 'G', ord=226, hex='e2'
4) char 'Ç', ord=128, hex='80'
5) char '£', ord=156, hex='9c'
6) char 'B', ord=066, hex='42'
7) char 'r', ord=114, hex='72'
8) char 'i', ord=105, hex='69'
9) char 'a', ord=097, hex='61'
10) char 'n', ord=110, hex='6e'
S2=>s: Brian<

انه عادي!!!

هناك اقتراح عملي آخر قابل للتنفيذ واجهته:Iconv -c -t ASCII < 6s-2014.1031-238246.halloween.exf.dif > exf.ascii.dif

إذا كانت السلسلة تحتوي على أي تاريخ غير هام، فهذا أمر جيد لإزالة تلك التاريخ غير الهام

     string InputString = "This is grate kingdom¢Ã‚¬â"; 
     string replace = "’";
     string OutputString= Regex.Replace(InputString, replace, "");

     //OutputString having the following result 

انها تعمل بشكل جيد بالنسبة لي، شكرا للبحث عن هذه المراجعة.

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