【问题标题】:How does WChar relate to Unicode and ASCIIWChar 与 Unicode 和 ASCII 有什么关系
【发布时间】:2011-10-12 12:55:36
【问题描述】:

我即将表明我对编码的工作原理和不同的字符串格式一无所知。

我正在将一个字符串传递给一个编译器(微软在他们的飞行模拟器中发生了这种情况)。该字符串作为 XML 文档的一部分传递,该文档用作编译器的源。这是使用标准 NET 字符串创建的。我不需要专门指定任何编码或类型设置,因为 XML 只是文本。

字符串只是字符的集合。这是给出错误的示例:

ARG、AFL、AMX、ACA、DAH、CCA、AEL、AGN、MAU、SEY、TSC、AZA、AAL、AN​​A、BBC、CPA、CAL、COA、CUB、DAL、UGX、ELY、UAE、ERT , ETH, EEZ, GHA, IRA, JAL, NWA, KAL, KAC, LAN, LDI, MAS, MEA, PIA, QTR, RAM, RJA, SVA, SIA, SWR, ROT, THA, THY, AUI, UAL, USA , ACA, TAR, UZB, IYE, QFA

如果我使用 C# 托管程序创建字符串,则没有问题。然而,这个字符串来自一个 c++ 程序,该程序可以使用自己的编译器创建编译文件,该编译器不符合 MS one

MS 编译器不喜欢该字符串。它抛出两个错误:

内部编译器错误:#C2621:无法转换 WChar 字符串! 内部编译器错误:#C2029:无法从 UNICODE 转换属性值!

不幸的是,编译器没有任何有用的文档说明其错误。我们只是充分利用我们所看到的!

我见过其他此类错误,但这些错误包含我可以捕获和删除的隐藏字符和控制字符。

在这种情况下,我将字符串视为 Char[] 并且看不到任何异常。只有我所期望的。没有超过 ascii 限制 127 的值,也没有控制字符。

我知道 WChar 是 C++ 理解的东西(但我不理解),Unicode 是字符的两字节表示,而 ASCII 是一字节表示。

我想做两件事 - 首先确定一个如果传递给编译器会失败的字符串,然后修复该字符串。我假设编译器期待 ASCII。

编辑

我说了不实话——事实上我确实使用了编码。我检查了用于将字节数组转换为字符串的代码。

public static string Bytes2String(byte[] bytes, int start, int length) {
            string temp = Encoding.Defaut.GetString(bytes, start, length);

        }

我意识到默认可能是一个问题,但将其更改为 ASCII 没有任何区别。我开始相信错误信息不是它看起来的那样。

【问题讨论】:

  • 什么编译器?如何将字符串传递给编译器?!
  • 编译器名为BglComp。它特定于 Microsoft 的 Flight Sims,它会生成 Sim 可以理解的风景文件 (.bgl)。该字符串作为 XML 文档中的属性传递。 XML 是这个编译器的源代码
  • 我不需要进行任何编码或类型设置,因为 XML 只是文本。 编码总是发生,无论你指定它明确与否。将编码视为“将人类语言的字母映射到字节序列”——不可能“不做”它。
  • 你当然是对的。我应该说我没有明确指定编码。
  • 如果未指定编码,XML 默认为 UTF-8 或 UTF-16。因此,如果您使用这三种编码中的任何一种,您应该会很好。另请注意,Unicode 不是字符的两字节表示。它是一个 21 位代码,可以用 1 到 4 个字节 (UTF-8)、2 个或 4 个字节 (UTF-16) 或总是 4 个字节 (UTF-32) 表示(以及其他一些压缩的古怪变体)一点)。

标签: c# string unicode


【解决方案1】:

看起来您正在获取一个字节数组,并使用Encoding.Default 返回的编码将其转换为字符串。

建议您不要这样做 (in the Microsoft documentation)。

您需要弄清楚 C++ 程序中使用什么编码来生成字节数组,并使用相同的(或兼容的)在 C# 代码中再次将字节数组转换回字符串。 例如。如果字节数组使用 ASCII 编码,你可以使用:

System.Text.ASCIIEncoding.GetString(bytes, start, length);

System.Text.UTF8Encoding.GetString(bytes, start, length);

附:我希望Joel doesn't catch you ;)

【讨论】:

  • 我希望他也不要 8-) 感谢您的回答,我现在正在编写代码来重构任何 .Default 实例。
【解决方案2】:

我必须来干净编译器错误与字符串的编码格式无关。事实证明,出错的是字符串的长度。根据示例,有许多用逗号分隔的条目。如果条目数超过 50,编译器会抛出相当无用的消息。

不过感谢大家的帮助 - 它在我的脑海中提出了编码问题,我现在会更仔细地研究它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2010-11-29
    • 2019-09-14
    • 2011-08-19
    相关资源
    最近更新 更多