WChar与Unicode和ASCII有什么关系?

3

我对编码和不同字符串格式的工作原理毫不了解。

我正在将一个字符串传递给编译器(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并没有什么区别。我开始相信错误消息并不是它所表现的那样。


什么编译器?你如何将字符串传递给编译器?! - Jacob Seleznev
编译器名为BglComp。它专门用于微软的飞行模拟器,并生成一个场景文件(.bgl),供模拟器使用。该字符串作为XML文档中的属性传递。XML是该编译器的源代码。 - ScruffyDuck
我并没有需要进行任何编码或类型设置,因为XML只是文本。无论您是否明确指定,编码始终会发生。将编码视为“将人类语言的字母映射到字节序列”——不可能“不做”它。 - Jon
当然,你是正确的。我应该说我没有明确指定编码。 - ScruffyDuck
1
如果没有指定编码方式,XML默认使用UTF-8或UTF-16。因此,如果您使用这三种编码之一,那么就没问题了。请注意,Unicode不是字符的双字节表示形式。它是一个21位代码,可以用1到4个字节(UTF-8),2或4个字节(UTF-16)或始终4个字节(UTF-32)表示(还有一些其他压缩一点的奇怪变体)。 - Joey
2个回答

2
看起来你正在使用字节数组,并使用由Encoding.Default返回的编码将其转换为字符串。

不建议这样做(在Microsoft文档中)。
你需要确定C++程序中使用的编码方式,以生成字节数组,并在C#代码中使用相同的编码方式(或兼容的编码方式)将字节数组转换回字符串。例如,如果字节数组使用ASCII编码,则可以使用以下方法:
System.Text.ASCIIEncoding.GetString(bytes, start, length);

或者

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

附言:我希望Joel不要抓住你;)


希望他也不会 8-) 感谢您的回答,我现在正在检查代码以重构任何 .Default 的实例。 - ScruffyDuck

0

我必须坦白承认,编译器错误与字符串的编码格式无关。事实证明,字符串的长度有问题。根据示例,有许多由逗号分隔的条目。如果条目数超过50个,编译器会抛出相当不友好的消息。

感谢大家的帮助 - 它引起了我对编码问题的关注,我现在会更加仔细地研究它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接