كيف يمكنك تجريد أحرف غير ASCII من سلسلة؟(شركة#)

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

  •  02-07-2019
  •  | 
  •  

سؤال

كيف يمكنك تجريد أحرف غير ASCII من سلسلة؟(شركة#)

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

المحلول

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);

نصائح أخرى

فيما يلي حل .NET خالص لا يستخدم التعبيرات العادية:

string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
    Encoding.Convert(
        Encoding.UTF8,
        Encoding.GetEncoding(
            Encoding.ASCII.EncodingName,
            new EncoderReplacementFallback(string.Empty),
            new DecoderExceptionFallback()
            ),
        Encoding.UTF8.GetBytes(inputString)
    )
);

قد يبدو الأمر مرهقًا، لكن يجب أن يكون بديهيًا.يستخدم ترميز .NET ASCII لتحويل سلسلة.يتم استخدام UTF8 أثناء التحويل لأنه يمكن أن يمثل أيًا من الأحرف الأصلية.ويستخدم EncoderReplacementFallback لتحويل أي حرف غير ASCII إلى سلسلة فارغة.

أعتقد أن MonsCamus كان يعني:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);

إذا كنت لا تريد التجريد، بل تريد تحويل الحروف اللاتينية المشددة إلى أحرف غير معلمة، فألق نظرة على هذا السؤال: كيف يمكنني ترجمة أحرف 8 بت إلى أحرف 7 بت؟(أي.Ü إلى U)

مستوحاة من حل التعبير العادي لفيلكروز, لقد قمت بعمل حل LINQ خالص

public static string PureAscii(this string source, char nil = ' ')
{
    var min = '\u0000';
    var max = '\u007F';
    return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}

public static string ToText(this IEnumerable<char> source)
{
    var buffer = new StringBuilder();
    foreach (var c in source)
        buffer.Append(c);
    return buffer.ToString();
}

هذا رمز لم يتم اختباره.

لا حاجة للتعبير العادي.فقط استخدم الترميز...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));

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

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);

إذا كنت تريد تجنب الأحرف الخاصة الأخرى أو التحقق من علامات الترقيم المحددة جدول أسكي

لقد جئت إلى هنا للبحث عن حل لأحرف ascii الموسعة، لكن لم أتمكن من العثور عليه.الأقرب الذي وجدته هو حل bzlm.لكن هذا لا يعمل إلا مع كود ASCII الذي يصل إلى 127 (من الواضح أنه يمكنك استبدال نوع الترميز في الكود الخاص به، لكنني أعتقد أنه كان معقدًا بعض الشيء لفهمه.ومن ثم مشاركة هذا الإصدار).وإليك الحل الذي يعمل ل رموز ASCII الموسعة، على سبيل المثال.حتى 255 وهو ايزو 8859-1

يقوم بإيجاد وإزالة الأحرف غير ascii (أكبر من 255)

Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"

Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", 
                                                New EncoderReplacementFallback(String.empty),
                                                New DecoderReplacementFallback())

Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)

Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)

console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:

وهنا أ كمان العمل للكود

استبدل الترميز وفقًا للمتطلبات، ويجب أن يظل الباقي كما هو.

هذا ليس الأداء الأمثل، ولكنه أسلوب Linq بسيط جدًا:

string strippedString = new string(
    yourString.Where(c => c <= sbyte.MaxValue).ToArray()
    );

الجانب السلبي هو أن جميع الأحرف "الباقية" يتم وضعها أولاً في مصفوفة من النوع char[] والذي يتم التخلص منه بعد ذلك string لم يعد المنشئ يستخدمه.

لقد استخدمت هذا التعبير regex:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");

أستخدم هذا التعبير العادي لتصفية الأحرف السيئة في اسم الملف.

Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")

يجب أن تكون هذه جميع الأحرف المسموح بها لأسماء الملفات.

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