هل هناك طريقة أفضل للتحويل إلى ASCII من المدخلات التعسفي؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

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

والآن، أنا فقط حصلت على القيام به كتابة هذا الرمز وأنا فقط لا أستطيع أن أصدق تماما عدم الكفاءة هنا. أربع نسخ من البيانات، ناهيك عن أي مخازن المتوسطة داخليا في StreamReader. هل هناك طريقة أفضل للقيام بذلك؟

// i_fileBytes is an incoming byte[]

string unicodeString = new StreamReader(new MemoryStream(i_fileBytes)).ReadToEnd();
byte[] unicodeBytes  = Encoding.Unicode.GetBytes(unicodeString.ToCharArray());
byte[] ansiBytes     = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, unicodeBytes);
string ansiString    = Encoding.ASCII.GetString(ansiBytes);

وأنا في حاجة إلى StreamReader () لأنه يحتوي على كاشف BOM الداخلية لاختيار الترميز لقراءة بقية الملف. ثم والباقي هو فقط لجعله تحويلها إلى سلسلة ASCII النهائية.

هل هناك طريقة أفضل للقيام بذلك؟

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

المحلول

إذا كنت قد حصلت على i_fileBytes في الذاكرة بالفعل، يمكنك التحقق فقط ما إذا كان يبدأ مع BOM، ومن ثم تحويل إما كلها أو مجرد قليلا بعد BOM باستخدام Encoding.Unicode.GetString. (استخدم الزائد الذي يتيح لك تحديد فهرس والطول.)

وهكذا كما كود:

int start = (i_fileBytes[0] == 0xff && i_fileBytes[1] == 0xfe) ? 2 : 0;
string text = Encoding.Unicode.GetString(i_fileBytes, start, i_fileBytes.Length-start);

لاحظ أن هذا يفترض وجود حقيقي Endian طفيف UTF-16 ترميز، ولكن. إذا كنت حقا بحاجة للكشف عن ترميز أولا، هل يمكن إما reimplement ماذا StreamReader، أو ربما مجرد بناء StreamReader من أول (ويقول) 10 بايت، واستخدام الخاصية CurrentEncoding للعمل على ما كنت <م> يجب استخدام للترميز.

وتحرير: الآن، أما بالنسبة للتحويل إلى ASCII - إذا كنت حقا في حاجة إليها فقط كسلسلة .NET، ثم يفترض أن كل ما تريد القيام به هو استبدال أي أحرف غير ASCII مع "؟" أو شيئا من هذا القبيل. (بدلا من ذلك قد يكون من الأفضل لرمي استثناء ... وهذا متروك لكم، بالطبع).

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

نصائح أخرى

System.Text.Encoding.ASCII.GetBytes(new StreamReader(new MemoryStream(i_fileBytes)).ReadToEnd())

وهذا يجب انقاذ بضعة رحلات ذهابا وإيابا.

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