首先,ISO-8859-1 中的 140 是 U+008C - ISO-8859-1 在数字和代码点之间具有直接的一对一映射 - 而 U+008C 是一个控制字符。众所周知,它没有Œ
(众所周知,如果在通常情况下使用它,法国人必须不使用连字,而Æ
被包括在内是因为在某些语言中它是为了支持它是一个单独的字母“ ash”而不是在法语中使用的连字。脾气变大了)。
string textToConvert = "Œ";
'"Œ"' 是一个字符串。它与“扩展 ascii”无关。它是由 UTF-16 在幕后实现的,但你甚至不应该这样想,而是一个与数字、字节或编码无关的字符串,直到你开始读取和写入流(如文件)。
Encoding iso8859 = Encoding.GetEncoding("iso-8859-1");
如上所述,您当然不希望这样。您可能想要GetEncoding("Windows-1252")
,因为这是与 8859-1 匹配的 Windows 编码,只是它取出了一些控件并放入了更多字母,包括Œ
在 position 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"));