2014-08-28 128 views
0

我已經建立了使用FPS虛擬鍵盤WPF從FPS組件作爲我的屏幕鍵盤觸摸屏的Windows應用程序的鍵盤語言。這個鍵盤有一個按鈕,可以通過安裝在Windows中的任何鍵盤語言進行循環,並且在整個應用程序中一切都很好。我遇到的問題出現在應用程序的一個方面,它可以鏈接到運行相同應用程序的其他本地網絡面板,並顯示從第一個輸入的一些信息。如果用戶將鍵盤語言切換爲阿拉伯語,則發送到遠程面板的字符串將顯示爲「?????」,我假定這是因爲語言不匹配。C# - 檢測輸入字符串

有沒有確定使用什麼語言的鍵盤輸入一個字符串,然後正確地顯示它的一個比較簡單的方法是什麼?從應用程序的角度來看,接收面板不需要實際更改其本地鍵盤設置,所以我寧願只是能夠正確顯示傳入的字符串,而不考慮語言,除非Windows的要求是本地設置更改。

的面板都與Windows上運行7

+0

你看過:http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture%28v=vs.110%29.aspx – Quintium 2014-08-28 16:50:15

+0

CultureInfo.CurrentUICulture – ethicallogics 2014-08-28 17:03:36

+1

一旦你已經捕獲一個字符串,輸入語言應該不重要;文字是文字。你如何編碼發送到其他網絡面板的字符串?您是否有測試往返文本編碼的手段,以查看是否有不同的unicode範圍在該過程中存在?根據你所看到的,網絡代碼可能會做一些天真的事情,比如執行簡單的char <=>字節轉換,而不是使用適當的文本編解碼器。 – 2014-08-28 17:24:14

回答

2

東西要記住的字符串是,他們沒有一個「語言」;一個字符串只是一系列的Unicode代碼點(即字符)。輸入設備的「語言」只是讓您選擇要添加的字符。一旦創建了字符串,其內容就與系統/線程語言環境或輸入設備無關。你捕獲了一些字符,現在它們被永久保存在字符串中。如果必要的字體可用於呈現字符串的內容,則它應該在運行應用程序的任何機器上以相同的方式顯示。

它應該足夠簡單,以驗證其他機器已經安裝了必要的字體 - 只需輸入在傳給你的問題(例如,阿拉伯語)語言一些文本,並確認其正確呈現。

也驗證基於輸入語言,你不是手動更改顯示面板的字體。 WPF的默認UI字體是一種「複合字體」,它將Unicode字符空間的子集映射到不同的字體系列。換句話說,如果字符串的一部分包含阿拉伯字形,相應的文本段將以阿拉伯字體顯示。您的標準拉丁字形將以系統字體顯示(例如,Segoe UI)等等。這是一個非常有用的功能,如果您覆蓋顯示面板的字體,則可能會失去這種靈活性。

如果一切上述檢查出來,而文字只有當它被送到「過線」亂碼,那麼它很可能是一個編碼的問題。也許你的網絡代碼是做一些幼稚,像在字符串中把每個char到一個byte,這對於標準的ASCII範圍內正常工作,但吐出來的垃圾爲更高的Unicode範圍。確保您的字符串正在使用正確的編解碼器進行編碼(例如,UTF8)。

+0

是的,我發送之前使用Encoding.ASCII。我切換到Encoding.UTF8,它效果很好。謝謝! – DrRocket 2014-08-29 04:03:16