11

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

「複数の文字や特殊文字を含む」

私は使用しようとしています

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

その文字列を ascii に変換するためのオブジェクト。この単純な仕事、つまり私の午後の狩りに光を当ててくれる人を誰かにお願いできますか。

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

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

4

5 に答える 5

20

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

古典的なUnicodeからASCIIへの問題のように見えます。秘訣は、それが起こっている場所を見つけることです。

.NETは、Unicodeで始まる(またはデフォルトのままである)と言われている場合、Unicodeで正常に動作します。

私の推測では、受信アプリはそれを処理できません。したがって、おそらく、String.Emptyを使用したEncoderReplacementFallbackでASCIIEncoder 使用します。

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を超える文字を削除していました...少なくとも米国の私たちの文字です。;)

于 2009-01-31T00:34:28.780 に答える
12

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

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

もっと簡単な方法があれば教えてください。

于 2009-01-31T00:25:33.477 に答える
7

拡張メソッドが好きな人にとっては、これでうまくいきます。

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

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

于 2012-02-02T21:48:34.683 に答える
5

上記のマークの回答 (およびジオのコメント) に基づいて、文字列からすべての ASCII 例外ケースを削除する 2 つのライナー バージョンを作成しました。この回答を検索する人々に提供されます(私が行ったように)。

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)); 
于 2014-03-28T09:33:45.837 に答える
1

多くのエンコーディングで使用される文字の 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);
于 2016-07-17T14:23:23.417 に答える