سؤال

وNSXMLParserInvalidCharacterError # 9

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

<نسخة أكس = "1.0"؟> <إصدار آر إس إس = "2.0">

وماذا يمكنني أن أفعل حول أحرف غير شرعية عند تحليل الأعلاف؟ أقوم اكتساح البيانات السابقة للتحليل؟ هل هناك شيء أنا في عداد المفقودين في API؟ وقد أي شخص التعامل مع هذه القضية؟

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

المحلول

NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

والثابتة مشاكلي ...

نصائح أخرى

وطريقة -initWithData:encoding: NSString يعود nil اذا فشلت، لذلك يمكنك محاولة ترميز واحدا تلو الآخر حتى تجد أحد أن يحول. هذا لا يضمن أن عليك تحويل جميع الأحرف بشكل صحيح، ولكن إذا كان مصدر تغذية الخاص بك لا يرسل لك XML المشفرة بشكل صحيح، ثم ربما عليك أن تعيش معها.

والفكرة الأساسية هي:

// try the most likely encoding
NSString xmlString = [[NSString alloc] initWithData:xmlData 
                                           encoding:NSUTF8StringEncoding];

if (xmlString == nil) {
  // try the next likely encoding
  xmlString = [[NSString alloc] initWithData:xmlData 
                                     encoding:NSWindowsCP1252StringEncoding];
}

if (xmlString == nil) {
  // etc...
}

لتكون عامة وقوية، يمكنك أن تفعل ما يلي حتى تنجح:

1.) حاول الترميز المحدد في رأس نوع المحتوى للاستجابة HTTP (إن وجدت)

2.) للتحقق من بداية البيانات استجابة ل بايت ترتيب علامة وإذا وجدت، في محاولة الترميز المبين

.

و3) انظر في وحدتي بايت الأولى. إذا وجدت حرف مسافة بيضاء أو '<' يقترن NUL حرف / صفر، في محاولة UTF-16 (وبالمثل، يمكنك التحقق من وحدات البايت الأربعة الأولى لمعرفة ما إذا كان لديك UTF-32)

.

و4) مسح بداية من البيانات تبحث عن إرشادات معالجة <?xml ... ?> والبحث في encoding='something' داخله. حاول أن الترميز.

و5) حاول بعض ترميزات المشتركة. بالتأكيد تحقق يندوز اللاتينية-1، ماك الروماني، وISO اللاتينية-1 إذا كان مصدر البيانات باللغة الإنجليزية.

و6) إذا كان أي من الأعمال المذكورة أعلاه، هل يمكن أن حاول إزالة كل بايت أكبر من 127 (أو بديل "؟" أو حرف ASCII آخر) وتحويل البيانات باستخدام الترميز ASCII.

إذا لم يكن لديك NSString من خلال هذه النقطة، يجب أن تفشل. إذا كان لديك أي NSString، يجب أن ننظر للإعلان encoding في إرشادات معالجة <?xml ... ?> (إذا لم تكن بالفعل في الخطوة 4). اذا كان هناك، يجب تحويل NSString إلى NSData استخدام هذا الترميز. إذا لم يكن هناك، يجب تحويل مرة أخرى باستخدام ترميز UTF-8.

وبالإضافة إلى ذلك، يمكن للوظائف CFStringConvertIANACharSetNameToEncoding() وCFStringConvertEncodingToNSStringEncoding() تساعد في الحصول على NSStringEncoding أن يذهب مع اسم ترميز تشكيل رأس Content-Type أو إرشادات معالجة <?xml ... ?>.

ويمكنك أيضا إزالة هذا الخط الترميز من أكس مثل هذا:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top