作爲使用MS Visual Studio 作爲工作平臺的C++ Developer,我已經工作了幾年。由於我私下更喜歡使用linux,所以我最近也採用了 的機會將我的工作環境轉移到linux。 由於我幾年來一直在優化我的Windows環境, 當然,結果發現有幾件事情沒有按預期工作或沒有按預期工作。 因此,我有一些問題,我不能與有用的答案來。如何在linux上調試時顯示Unicode字符串?
讓我們開始下面的問題,稍後可能會出現不同的問題。 這個問題是我已經偶然發現了幾次, 每當我被迫在非Windows平臺上調試特定於平臺的錯誤。
簡單地說:如何在Linux上調試時顯示Unicode(UCS2編碼)字符串?
現在我已經計算了一些更多細節。我們的庫interally使用基於Unicode String類,它編碼每個字符的16位Unicode值(但我們不這樣做 支持多字的編碼,因此,我們基本上只能使用UCS2可編碼子UTF16的 ,但是這包括幾乎所有使用無論如何腳本)。 這已經引起了一個問題,因爲大多數平臺(即linux/unix)認爲 wchar_t
類型由4個字節組成,而在Windows上它只有2個字節,因此我不能簡單地將內部字符串緩衝區轉換爲(wchar_t *
),所以我不確定, 如果這真的會幫助任何調試器。
對於gdb我已經想通了,我可以從調試的代碼調用函數到 打印調試消息。因此,我在我們的lib中插入了一個特殊函數, 可以任意轉換字符串數據並將其寫入新的緩衝區。 目前,我將我們的內部緩衝區轉碼爲utf8,因爲我認爲 最有可能工作。
但到目前爲止,這只是部分地解決了這個問題:如果字符串是拉丁語, 話,我現在得到一個可讀的輸出(而一個不能直接打印拉丁 數據如果是16位編碼),但我也有處理其他腳本 (fe CJK(又名Hansi/Kanji),西里爾文,希臘語...)和處理我的意思是 我必須使用這樣的腳本專門調試數據,因爲使用的腳本直接影響控制流程 。 當然,在這些情況下,我只能看到與構成utf8字符的多個 字節對應的ISO字符,這使得調試CJK數據更加神祕,然後正確顯示字符串。
通常gdb允許設置多個主機和目標編碼,因此它應該是 是可能的,以將正確編碼的utf8數據流發送到控制檯。
但我當然更喜歡使用IDE進行調試。目前我正在嘗試 與eclipse和CDT交朋友,但爲了調試,我也測試了kdgb。 在這兩個應用程序中,我至今只能獲得錯誤解碼的utf8數據。 另一方面,我曾經在一個Windows平臺 上eclipse中調試過一個java項目,並且所有內部字符串都被正確顯示(但是這個應用程序不是使用我們的lib和相應的字符串的 ),因此至少在某些情況下,eclipse可以使用 顯示unicode字符正確。
最討厭的點對我來說,到目前爲止我甚至不能拿出 任何證據,這顯示真正的Unicode數據(即非ISO字符)是Linux在任何安裝工作 (即連GDB爲將QString腳本我發現,似乎 只顯示拉丁字符,並跳過其餘的),但當然 的幾乎每一個Linux應用程序似乎支持Unicode數據,從而有 必須被周圍的人,在Linux平臺,調試真正的Unicode數據 ,我真的無法想象,他們都是讀書hexcodes,而不是直接 顯示unicode字符串。
因此,任何指向允許調試unicode字符串的設置的指針,基於任何其他字符串類(f.e.QString)和/或IDE的 也將被理解。
我剛剛嘗試在命令行上使用普通的 gdb調試我的應用程序,並且這顯示至少有一個我正確測試的(我在gdb和konsole設置中使用utf-8字符集)測試的一個 漢字字符。 因此,這減少了上述問題,我怎麼能在任何IDE做同樣的 事情? – user209210 2009-11-12 12:02:11
另一個有趣的觀察,當我嘗試在eclipse中打印utf-8或utf-32字符串時,拉丁字符被正確打印,非拉丁字符被轉義爲hexcode,即我沒有看到由編碼問題導致的常見ISO垃圾字符。這可能意味着要麼Ecl。或gdb確實正確解碼字符串,然後轉義非ASCII字符。正如之前所寫,對於控制檯編碼中的gdb,我設法查看正確的字符,因此這實際上看起來像eclipse正確解碼字符串並在發送到UI時將其轉義出來? 有沒有可能驗證或影響這個? – user209210 2009-11-12 15:29:22
這聽起來像你在Eclipse中使用的字體沒有你感興趣的所有字符的字形。希望Eclipse可以讓你改變字體 - 找到一個你想要的字形... – caf 2009-11-13 01:43:28