2011-07-25 28 views
3

我即將展示我完全不知道編碼如何工作以及不同的字符串格式。WChar如何與Unicode和ASCII相關

我傳遞一個字符串到編譯器(微軟,因爲它發生amd他們的飛行模擬器)。該字符串作爲用作編譯器源的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編譯器不喜歡字符串。它會引發兩個錯誤:

內部編譯器錯誤:#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); 

     } 

我意識到Default可能是一個問題,但將其更改爲ASCII沒有區別。我開始相信錯誤信息不是它所看到的。

+0

什麼編譯?你如何將一個字符串傳遞給編譯器? –

+0

編譯器被稱爲BglComp。它特定於微軟的Flight Sims,它會生成一個模擬人所理解的風景文件(.bgl)。該字符串作爲XML文檔中的一個屬性傳遞。 XML是此編譯器的源代碼 – ScruffyDuck

+0

*我不需要參與任何編碼或設置類型,因爲XML只是文本。*編碼*總是*會發生,無論您是否明確指定它。把編碼想象成「將人類語言的字母映射到字節序列」 - 不可能「不做」它。 – Jon

回答

2

它看起來像你正在採取一個字節數組,並使用由Encoding.Default返回的編碼將其轉換爲字符串。我們建議您不要這樣做(in the Microsoft documentation)。

您需要計算出C++程序中用於生成字節數組的編碼,並使用相同的(或兼容的)編碼將字節數組再次轉換爲C#代碼中的字符串。 例如如果字節數組是使用ASCII編碼,你可以使用:

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

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

附:我希望Joel doesn't catch you;)

+0

我希望他不要8-)感謝您的回答我現在正在編寫重構.Default任何實例的代碼。 – ScruffyDuck

0

我得來得乾乾淨淨說編譯器的錯誤跟字符串的編碼格式無關。事實證明,這是錯誤的字符串的長度。根據樣本,有許多條目用逗號分隔。如果條目數超過編譯器會引發相當unhelful消息50

不過謝謝大家對你的幫助 - 它提出的編碼問題在我的腦海裏,我現在它看起來更仔細