WChar与Unicode和ASCII有什么关系?

本文关键字:什么 关系 ASCII Unicode WChar | 更新日期: 2023-09-27 18:03:17

我将展示我对编码如何工作和不同字符串格式的完全无知。

我正在传递一个字符串给编译器(微软,因为它发生在他们的飞行模拟器)。该字符串作为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[],没有发现任何异常。正如我所料。

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

我想做两件事-首先识别一个字符串,如果传递给编译器将失败,第二修复字符串。我假设编译器期望ASCII。

编辑

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

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

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

WChar与Unicode和ASCII有什么关系?

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

建议您不要这样做(在Microsoft文档中)。

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

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

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

注:我希望Joel没抓到你;)

我必须澄清编译器错误与字符串的编码格式无关。原来是字符串的长度出了问题。根据示例,有许多用逗号分隔的条目。如果条目数超过50,编译器将抛出相当无用的消息。

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