我即将展示我对编码的工作原理以及不同的字符串格式的完全无知。
我正在将一个字符串传递给编译器(微软因为它的飞行模拟器而发生)。该字符串作为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,美国,ACA,TAR,UZB,IYE,QFA
如果我使用我的C#托管程序创建字符串,则没有问题。但是,这个字符串来自一个c ++程序,它可以使用自己的编译器创建编译文件,该编译器与MS不兼容
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没有任何区别。我开始相信错误信息并非如此。
答案 0 :(得分:2)
看起来你正在使用一个字节数组,并使用Encoding.Default
返回的编码将其转换为字符串。
建议您不要这样做(in the Microsoft documentation)。
您需要弄清楚在C ++程序中使用什么编码来生成字节数组,并使用相同的(或兼容的)在C#代码中将字节数组再次转换回字符串。 例如。如果字节数组使用ASCII编码,则可以使用:
System.Text.ASCIIEncoding.GetString(bytes, start, length);
或
System.Text.UTF8Encoding.GetString(bytes, start, length);
P.S。我希望Joel doesn't catch you;)
答案 1 :(得分:0)
我必须来清理编译器错误与字符串的编码格式无关。事实证明,它是错误的字符串的长度。根据示例,有许多以逗号分隔的条目。如果条目数超过50,编译器会抛出相当不理想的消息。
但是感谢大家的帮助 - 它在我的脑海中提出了编码问题,现在我会更仔细地看一下