0

我正在编写一个 Windows 应用程序。在将扩展 ASCII [128-256]转换为其十进制等效项时遇到问题。

当我从 jar 文件中接收到扩展的 ASCII 比如说“Œ”时,它会像这样进入 C# 应用程序:�.

我能知道如何将其转换为等效的十进制数 [即] 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,另一个是mac。由于这来自一个 jar 文件,因此应该是独立于操作系统的,我会说正确的编码是 iso-8859-15。

使用正确的编码,您对 GetBytes 的调用应该返回一个包含十进制值的数组。

于 2012-08-17T14:08:07.447 回答
0

首先,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"));
于 2012-08-17T14:08:49.037 回答