まず、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"));