【问题标题】:How to convert Extended ASCII to decimal in Windows Forms C#?如何在 Windows 窗体 C# 中将扩展 ASCII 转换为十进制?
【发布时间】:2012-08-17 13:12:12
【问题描述】:

我正在编写一个 Windows 应用程序。在将 Extended 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);

请帮助我。我该怎么办??

【问题讨论】:

  • 你能解释一下,“十进制”等价物是什么意思?你是说字符代码?或者你想像 OE 一样正确显示它而不是 [?] ?
  • 十进制值应该在您的 srcTextBytes 字节数组中。
  • 此问题始于 iso-8859-1 编码没有与“Œ”匹配的字符。 en.wikipedia.org/wiki/ISO_8859-1#Codepage_layout结果是GIGO。
  • 你想要的是 Windows-1252 编码。
  • @quetzalcoatl:是的,字符代码..

标签: c# winforms ascii extended-ascii asciiencoding


【解决方案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]

【讨论】:

    【解决方案2】:

    您的编码错误。正如 Hans 所指出的,iso-8859-1 编码没有字符 128-159。根据this acrticle,有 3 种编码包含您要查找的字符。有iso-8859-15,Windows-1252,另一个是mac。由于这来自一个 jar 文件,因此应该是独立于操作系统的,我会说正确的编码是 iso-8859-15。

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

    【讨论】:

    • ISO-8859-1 的字符为 128-159,尽管它们都是控制字符。 Windows-1252 在许多操作系统上都很常见,因为它是使用带有西欧语言的 Windows 的人(很多人)中非常常见的字符集。
    【解决方案3】:

    首先,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 编码,只是它去掉了一些控件并输入了更多字母,包括Œ 位置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"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 2017-10-26
      相关资源
      最近更新 更多