vb.net - سلسلة من الفارغ
سؤال
لدي قيمة سلسلة قراءة من ملف 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