如何将扩展 ascii 转换为 System.String?
Posted
技术标签:
【中文标题】如何将扩展 ascii 转换为 System.String?【英文标题】:How can I convert extended ascii to a System.String? 【发布时间】:2010-10-14 13:29:31 【问题描述】:例如:“½”或 ASCII DEC 189。当我从文本文件中读取字节时,byte[] 包含有效值,在本例中为 189。
转换为 Unicode 会导致 Unicode 替换字符 65533。
UnicodeEncoding.Unicode.GetString(b);
转换为 ASCII 结果为 63 或“?”
ASCIIEncoding.ASCII.GetString(b);
如果这不可能,那么处理这些数据的最佳方法是什么?我希望能够执行像 Replace() 这样的字符串函数。
【问题讨论】:
【参考方案1】:字节 189 表示 iso-8859-1(又名“Latin-1”)中的“½”,因此您可能需要以下内容:
var e = Encoding.GetEncoding("iso-8859-1");
var s = e.GetString(new byte[] 189 );
.NET 中的所有字符串和字符都是 UTF-16 编码的,因此您需要使用编码器/解码器来转换任何其他内容,有时这是默认设置(例如,对于 FileStream 实例使用 UTF-8),但好的做法是始终指定.
您将需要某种形式的隐式或(更好的)显式元数据来为您提供有关哪种编码的信息。
【讨论】:
这个编码的东西一直让我发疯......但你的回答对我有用!!!我花了一段时间才弄清楚要搜索什么,但最后我弄清楚了正确的搜索词应该是什么。 :) 感谢您为我的问题提供了一个简单的解决方案。 :) 但是我们不能在每次读取时都添加这段代码,应该有其他更好的方法来做到这一点。 @Rajan365:“每次阅读”是什么意思? (很可能你应该问一个新问题。) @Richard 我的意思是,我可以使用 Encoding.Default 再次获得相同的代码页,而不是明确指定“iso-8859-1”之类的代码页吗? @Rajan365 如果默认值始终是正确的编码,那么当然可以。但是如果用户的语言环境改变了,那么默认编码可能也会改变。此外,您当然可以保留Encoding
实例,您不需要为每个字符串获取一个新实例。【参考方案2】:
旧的 PC-8 或扩展 ASCII 字符集在 IBM 和 Microsoft 将 Code Pages 的概念引入 PC 世界之前就已经存在。这是 1982 年的扩展 ASCII。事实上,它是当时 PC 上唯一可用的字符集,直到 EGA 卡允许您将其他字体加载到 VRAM 中。
这也是 ANSI 终端的默认标准,在 80 年代和 90 年代初,我拨打的几乎每个 BBS 都使用此字符集来显示菜单和框。
这是将 8 位扩展 ASCII 转换为 Unicode 文本的代码。注意代码的关键位:GetEncoding("437")。它使用 Code Page 437 将 8 位 ASCII 文本转换为 Unicode 等价物。
string ASCII8ToString(byte[] ASCIIData)
var e = Encoding.GetEncoding("437");
return e.GetString(ASCIIData);
【讨论】:
哇!谢谢!作为旁注,您的答案也是如何将字节数组转换为字符串并返回的非常好的解决方案。【参考方案3】:这完全取决于编码是什么。
没有“ASCII 189”之类的东西 - ASCII 最多只能达到 127。有许多编码,其中 8 位编码使用 ASCII 作为前 128 个值。
您可能想要Encoding.Default
(这是您特定系统的默认编码),但很难确定。您的数据来自哪里?
【讨论】:
我在 byte[] 中读取的内容与此扩展 ascii 图表中的 188 - 190 一致:charlie.balch.org/asp/ascii.asp。 Encoding.Default 成功了。非常感谢! 很高兴它起作用了 - 请注意,任何谈论“扩展 ASCII”的人就好像这意味着一种特定的编码不知道他们在说什么。这就像在谈论“一美元”——一美元、澳元、加元,什么?在特定情况下可能有意义 但这不是一个确定的和独特的想法。所以我敢说 Charlie 的“扩展 ASCII”想法适合 他的 文化 - 但它与其他人的计算机上发生的情况不符。【参考方案4】:System.String[]
不能存储带有ASCII > 127
的字符
如果您尝试处理任何扩展的 ASCII 字符,例如 œ ¢ ½ ¾
here,则可以将其转换为等效的二进制和十进制
【讨论】:
以上是关于如何将扩展 ascii 转换为 System.String?的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 iconv 将多字节智能引号转换为扩展的 ASCII 智能引号吗?
扩展的 ASCII 字符,例如欧元符号被转换为其 unicode 等价物