web-dev-qa-db-ja.com

C#で文字列をutf8からASCII(1バイト))に変換(文字変換)する方法は?

文字列オブジェクトがあります

「複数の文字、さらには特殊文字」

使用しようとしています

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

その文字列をASCIIに変換するためのオブジェクト。誰かにこの簡単な仕事に光を当てるように頼むことができます。

編集1:私たちが達成しようとしているのは、いくつかの特殊なウィンドウアポストロフィのような特殊文字を取り除くことです。以下に私が回答として投稿したコードはそれを処理しません。基本的に

O'BrianはO?Brianになります。ここで、 'は特別なアポストロフィの1つです

11
Geo

これは、削除されたように見える他の質問への回答でした...要点はまだ残っています。

クラシックUnicodeからASCII問題 のように見えます。コツはwhereを見つけることですそれが起こっています。

.NETは、Unicodeで正常に機能します。ただし、最初に(またはデフォルトのままにして) nicodeであると伝えられている であると仮定します。

私の推測は、受信側のアプリケーションが処理できないことです。したがって、おそらく ASCIIEncoderwith an 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より大きい ...まあ、少なくとも米国にいる人は。 ;)

20
Mark Brackett

私はそれを理解することができました。誰かが私のために働いたコードの下で知りたい場合:

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

もっと簡単な方法があるかどうか教えてください。

12
Geo

拡張メソッドが好きな人にとっては、これは私たちにとってはトリックです。

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;
        }
    }
}

(システム名前空間なので、すべての文字列でほぼ自動的に使用できます。)

7
Peter Drier

上記のマークの回答(およびジオのコメント)に基づいて、2行のバージョンを作成して、すべての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)); 
5
tonycoupland

多くのエンコーディングで使用される文字の8ビット表現が必要な場合は、これが役立つことがあります。

変数を変更する必要があります targetEncoding 好きなエンコーディングに。

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);
1