我对编码和不同字符串格式的工作原理毫不了解。
我正在将一个字符串传递给编译器(Microsoft,用于他们的Flight Simulator)。该字符串作为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编译器不兼容。
MS编译器不喜欢该字符串。它会抛出两个错误:
INTERNAL COMPILER ERROR:#C2621:无法转换WChar字符串! INTERNAL COMPILER ERROR:#C2029:无法从UNICODE转换属性值!
不幸的是,编译器没有有用的错误文档。我们只能尽力看到什么!
我看到过其他这种类型的错误,但其中包含我可以捕获和删除的隐藏字符和控制字符。
在这种情况下,我将该字符串视为Char[],但看不到任何异常。只有我预期的内容。没有超过127的ASCII限制值和没有控制字符。
我知道WChar是C++理解的东西(但我不知道),Unicode是字符的两个字节表示,而ASCII是一个字节表示。
我想做两件事-首先识别将传递给编译器的字符串,如果失败,则修复该字符串。我假设编译器期望ASCII。
编辑
我说了谎-实际上我确实使用了编码。我检查了用于将字节数组转换为字符串的代码。
public static string Bytes2String(byte[] bytes, int start, int length) {
string temp = Encoding.Defaut.GetString(bytes, start, length);
}
我意识到默认可能是一个问题,但将其更改为ASCII并没有什么区别。我开始相信错误消息并不是它所表现的那样。