0

私はWindowsアプリケーションを書いています。拡張ASCII[128-256]を同等の10進数に変換する際に問題が発生しています。

jarファイルから「Œ」などの拡張ASCIIを受信すると、次のようにC#アプリケーションに入ります。

これを10進数に相当する[ie]140に変換する方法を教えてください。

string textToConvert = "Œ";
Encoding iso8859 = Encoding.GetEncoding("iso-8859-1");
Encoding unicode = Encoding.Unicode;
byte[] srcTextBytes = iso8859.GetBytes(textToConvert);
byte[] destTextBytes = Encoding.Convert(iso8859,unicode, srcTextBytes);
char[] destChars = new char[unicode.GetCharCount(destTextBytes, 0, destTextBytes.Length)];
unicode.GetChars(destTextBytes, 0, destTextBytes.Length, destChars, 0);
System.String szchar = new System.String(destChars);

MessageBox.Show(szchar);

私を助けてください。どうすればいいですか?

4

3 に答える 3

1

私はあなたがこのようなものを探していると思います

    String str="œ";
    var bytes = Encoding.GetEncoding("Windows-1252").GetBytes(s);
    string binStr = string.Join("", bytes.Select(b => Convert.ToString(b, 2)));
    int decimalEquivalent=Convert.ToInt32(binStr,2);
    Console.WriteLine(decimalEquivalent);

これはASCII [128-255]で機能しています

于 2014-07-18T14:28:41.260 に答える
0

エンコーディングが間違っています。Hans が指摘したように、iso-8859-1 エンコーディングには文字 128-159 がありません。この記事によると、探している文字を含む 3 つのエンコーディングがあります。iso-8859-15 と Windows-1252 があり、もう 1 つは mac 用です。これはjarファイルからのものであり、OSに依存しないはずなので、正しいエンコーディングはiso-8859-15です。

適切なエンコーディングを使用すると、GetBytes の呼び出しは 10 進数値を含む配列を返すはずです。

于 2012-08-17T14:08:07.447 に答える
0

まず、ISO-8859-1 の 140 は U+008C です。ISO-8859-1 では、数値とコードポイントが 1 対 1 で直接マッピングされます。U+008C は制御文字です。それがないことは有名ですŒ(有名なことに、フランス人が通常使用する場合は合字を使用しない必要があるという論争がありましたがÆ、一部の言語では別の文字をサポートすることを意図していたため、含まれています。"フランス語での使用による合字ではなく、灰」。

string textToConvert = "Œ";

'"ā"' は文字列です。「拡張ASCII」とは何の関係もありません。これは舞台裏で UTF-16 によって実装されていますが、そのように考えるべきではなく、読み書きを開始するまでは、数値、バイト、またはエンコーディングとは何の関係もない文字列として考えるべきです。ストリーム (ファイルなど)。

 Encoding iso8859 = Encoding.GetEncoding("iso-8859-1");

上で説明したように、これは絶対に必要ありません。GetEncoding("Windows-1252")これは 8859-1 に一致する Windows エンコーディングであるため、一部のコントロールが削除されŒ、位置を含むいくつかの文字が追加されているため、おそらく必要です140。そのように変更したとしましょう...

byte[] srcTextBytes = iso8859.GetBytes(textToConvert);

この時点で、CP-1252 を使用するように変更すると、値が 140 (0x8C) の単一バイトのバイト配列ができます。

byte[] destTextBytes = Encoding.Convert(iso8859,unicode, srcTextBytes);
char[] destChars = new char[unicode.GetCharCount(destTextBytes, 0, destTextBytes.Length)];
unicode.GetChars(destTextBytes, 0, destTextBytes.Length, destChars, 0);
System.String szchar = new System.String(destChars);

MessageBox.Show(szchar);

あなたがここで何をしようとしているのか、私にはわかりません。ひもで始まり、ひもで終わっていますが、何が起こっているのでしょうか?

これを放棄して、ゼロから始めましょう。

文字列があり、それを表す CP-1252 のバイトが必要な場合は、次のようにします。

byte[] result = Encoding.GetEncoding("Windows-1252").GetBytes(inputString);

CP-1252 にいくつかのバイトがあり、それらが表す文字列が必要な場合:

string result = System.Text.Encoding.GetEncoding("Windows-1252").GetString(inputBytes);

Windows-1252 でストリーム (ファイル、ネットワーク ストリームなど) を読み書きする場合は、そのエンコーディングで作成された StreamReader または StreamWriter を使用します。

using(TextReader reader = new StreamReader(source, Encoding.GetEncoding("Windows-1252"));
using(TextWriter writer = new StreamWriter(sink, Encoding.GetEncoding("Windows-1252"));
于 2012-08-17T14:08:49.037 に答える