سؤال

لدي قيمة سلسلة قراءة من ملف CSV. يحتوي ملف CSV على 7 NULL بايت ، لقد أكدت ذلك عن طريق فتحه في محرر سداسي ، ومن المؤكد أن هناك 7 0x0 بايت هناك. هذه السلسلة تسبب لي الألم.

في VB.NET عندما أتحقق من strlen من هذه السلسلة ، تُرجع قيمة 7 وإذا قمت بذلك String.IsNullOrWhitespace يعود false.

لا أستطيع أن أفهم لماذا هذا؟ لقد قمت بتقسيم السلسلة إلى صفيف بايت وكل بايت 0x0, ، وهو فارغ/لا شيء. أ string = Nothing المقارنة تفشل أيضا.

أريد أن أكون قادرًا على استبدال هذه السلسلة بسلسلة من بلدي ولكن لا يمكنني القيام بذلك ديناميكيًا. أي اقتراحات تجعل هذه السلسلة تعيد طول 7 على الرغم من أن كل بايت 0x0?

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

المحلول

الحرف الخالي ليس مسافة بيضاء ، ومرجع السلسلة الخاص بك ليس شيئًا ، لذلك أتوقع String.IsNullOrWhitespace() للعودة كاذبة

نصائح أخرى

لسوء الحظ، ال null الحرف سبع مرات ليست سلسلة فارغة ، أو سلسلة فارغة. تذكر في .NET سلسلة في مستوى ما أ مؤشر إلى صفيف شخصية. السلسلة لاغية إذا تم ضبط هذا المؤشر على NULL. السلسلة فارغة إذا كان المؤشر يشير إلى صفيف طول الصفر. في هذه الحالة ، يشير المؤشر إلى سبع مجموعة من الشخصيات الفارغة (البايت كونه جميع الأصفار).

سلسلة فارغة

A ->

سلسلة فارغة

A -> ()

سلسلتك

A -> ((0) (0) (0) (0) (0) (0) (0))

يمكنك اختبار هذه الشخصية الفارغة باستخدام

char nullChar = char.ConvertFromUtf32(0);
string nullCharString = new String(nullChar);
bool hasNullChar = A.Contains(nullCharString);

يتحقق isNullEmptyorWhiteSpace إذا كان المتغير نفسه فارغًا ، وليس إذا كانت السلسلة تحتوي على أحرف خالية. شخصية فارغة ليست مسافة بيضاء. لذلك هذا الشيك يفشل أيضا.

أقترح عليك استخدام trim () ، بعد الاختبار. في C# سيبدو هذا:

bool MyNullCheck(string s) {
    if (s == null) return false;
    s = s.Trim(new string(char.ConvertFromUtf32(0), 1));
    return string.IsNullEmptyOrWhiteSpace(s);
}

حاول التحويل إلى VB (لم يتم التحقق منها)

Function MyNullCheck(s as String) as Boolean
  If s Is Nothing Then
     Return False
  End If
  s = s.Trim(New String(vbNullChar, 1))
  Return String.IsNullEmptyOrWhiteSpace(s)
End Function

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

يمكنك استخدام Trim الطريقة (أو TrimEnd) لإزالة أحرف NUL من خلال تحديد أنه يجب أن تقطع أحرف NUL: str = str.Trim(Chr(0)), ، لكنني أعتقد أنه يجب عليك أن تسأل نفسك عن سبب وجود أحرف NUL في السلسلة لتبدأ.

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

  • أ لا شيء السلسلة هي واحدة لم يتم تهيئة أو تم ضبطها على Nothing.
  • و فارغة السلسلة هي واحدة تحتوي على السلسلة الفارغة String.Empty أو "".
  • أحرف المسافة البيضاء هي مساحة ، علامة تبويب ، سطر جديد ، عودة النقل و غيرها الكثير. ولكن ليس الشخصية الفارغة.
  • خيطك ليس فارغًا ولا Nothing. أنه يحتوي على 7 أحرف ، كل واحدة هي الحرف الفارغ - لذلك ليس مسافة بيضاء.

يمكنك استخدام string.replace لإزالة الأحرف الصفر؟ شيء من هذا القبيل

s = s.Replace(vbNullChar, "")

أراهن أنك واجهت مشكلة تشفير. حاول قراءة الملف باسم UTF-16

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