【发布时间】:2011-10-12 12:55:36
【问题描述】:
我即将表明我对编码的工作原理和不同的字符串格式一无所知。
我正在将一个字符串传递给一个编译器(微软在他们的飞行模拟器中发生了这种情况)。该字符串作为 XML 文档的一部分传递,该文档用作编译器的源。这是使用标准 NET 字符串创建的。我不需要专门指定任何编码或类型设置,因为 XML 只是文本。
字符串只是字符的集合。这是给出错误的示例:
ARG、AFL、AMX、ACA、DAH、CCA、AEL、AGN、MAU、SEY、TSC、AZA、AAL、ANA、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) 表示(以及其他一些压缩的古怪变体)一点)。