كيفية تحويل (الترجمة الحرفية) لسلسلة من utf8 إلى ASCII (بايت واحد) في C#؟

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

سؤال

لدي كائن سلسلة

"مع أحرف متعددة وحتى أحرف خاصة"

أحاول استخدامها

UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();

كائنات من أجل تحويل تلك السلسلة إلى ascii.هل لي أن أطلب من شخص ما أن يسلط بعض الضوء على هذه المهمة البسيطة، التي تطاردني بعد الظهر.

تحرير 1:ما نحاول تحقيقه هو التخلص من الأحرف الخاصة مثل بعض الفواصل العليا الخاصة بالنوافذ.الكود الذي نشرته أدناه كإجابة لن يعتني بذلك.أساسًا

سوف يصبح أوبراين أوبراين.حيث ' هي إحدى الفواصل العليا الخاصة

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

المحلول

كان

وذلك ردا على سؤالك الآخر، الذي يبدو وكأنه تم حذفه .... النقطة لا يزال قائما.

ويبدو وكأنه يونيكود الكلاسيكية لقضية ASCII . ان الخدعة في إيجاد <م> حيث أنه يحدث.

و. NET يعمل بشكل جيد مع يونيكود، على افتراض انه قال انها يونيكود لتبدأ (أو اليسار في الافتراضي).

وبي <م> تخمين هو أن التطبيق المتلقي لا يمكن التعامل معها. لذلك، كنت على الارجح استخدام ASCIIEncoder <ل أ href = "http://msdn.microsoft.com/en-us/library/system.text.encoder.fallback.aspx" يختلط = "noreferrer"> مع على <لأ href = "HTTP: // msdn.microsoft.com/en-us/library/system.text.encoderreplacementfallback.aspx "يختلط =" noreferrer "> EncoderReplacementFallback مع String.Empty:

using System.Text;

string inputString = GetInput();
var encoder = ASCIIEncoding.GetEncoder();
encoder.Fallback = new EncoderReplacementFallback(string.Empty);

byte[] bAsciiString = encoder.GetBytes(inputString);

// Do something with bytes...
// can write to a file as is
File.WriteAllBytes(FILE_NAME, bAsciiString);
// or turn back into a "clean" string
string cleanString = ASCIIEncoding.GetString(bAsciiString); 
// since the offending bytes have been removed, can use default encoding as well
Assert.AreEqual(cleanString, Default.GetString(bAsciiString));

وبطبيعة الحال، في الأيام الخوالي، كنا مجرد حلقة وعلى الرغم من إزالة أي حرف أكبر من 127 .. .well، أولئك منا في الولايات المتحدة على الأقل. ؛)

نصائح أخرى

وكنت قادرا على أنها من أصل الرقم. في حالة شخص يريد أن يعرف أدناه التعليمات البرمجية التي عملت بالنسبة لي:

ASCIIEncoding ascii = new ASCIIEncoding();
byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal);
byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
string finalString = ascii.GetString(asciiArray);

واسمحوا لي أن أعرف إذا كان هناك طريقة أسهل س القيام بذلك.

لأي شخص الذي يحب أساليب الإرشاد، هذا واحد لا حيلة لنا.

using System.Text;

namespace System
{
    public static class StringExtension
    {
        private static readonly ASCIIEncoding asciiEncoding = new ASCIIEncoding();

        public static string ToAscii(this string dirty)
        {
            byte[] bytes = asciiEncoding.GetBytes(dirty);
            string clean = asciiEncoding.GetString(bytes);
            return clean;
        }
    }
}

و(مساحة اسم النظام بحيث انها متوفرة الى حد كبير تلقائيا لجميع السلاسل لدينا.)

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

using System.Text;

// Create encoder with a replacing encoder fallback
var encoder = ASCIIEncoding.GetEncoding("us-ascii", 
    new EncoderReplacementFallback(string.Empty), 
    new DecoderExceptionFallback());

string cleanString = encoder.GetString(encoder.GetBytes(dirtyString)); 

إذا كنت تريد تمثيل 8 بت للأحرف المستخدمة في العديد من عمليات الترميز، فقد يساعدك ذلك.

يجب عليك تغيير المتغير targetEncoding.target إلى أي ترميز تريده.

Encoding targetEncoding = Encoding.GetEncoding(874); // Your target encoding
Encoding utf8 = Encoding.UTF8;

var stringBytes = utf8.GetBytes(Name);
var stringTargetBytes = Encoding.Convert(utf8, targetEncoding, stringBytes);
var ascii8BitRepresentAsCsString = Encoding.GetEncoding("Latin1").GetString(stringTargetBytes);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top