簡體   English   中英

字符串被神秘地切斷了

[英]String gets mysteriously cut off

在我的應用程序中,我使用WpfLocalization在應用程序運行時提供翻譯。 該庫基本上維護屬性列表及其分配的本地化關鍵字,並在更改活動語言時使用DependencyObject.SetValue()更新其值。

我注意到我的問題的情況是這樣的:我有一個簡單的TextBlock並為其Text屬性分配了一個本地化關鍵字。 現在,當我的應用程序啟動時,它會將初始值寫入其中,它將在屏幕上顯示正常。 現在我切換語言,新值被設置為Text屬性,但實際上只有一半的文本顯示在屏幕上。 來回切換語言沒有任何影響。 第一種語言總是顯示正常,第二種語言被截斷(在單詞的中間,但總是完整的字符)。

兩種語言之間的相對長度似乎與它沒有任何關系。 在我的測試用例中,工作語言字符串是498個字節,被切斷的字符串是439個字節,在257個字節后被切斷。

當我在通過本地化代碼更改其值之前檢查所述TextBlockText屬性的當前值時,它將始終具有任一語言的預期值(不會被截斷)。

通過WPF Inspector在運行時檢查TextBlock時,它將以第二種語言顯示剪切文本作為Text屬性。

到目前為止,這對我來說毫無意義。 但現在它變得更好了。

原始WpfLocalization庫從標准資源文件中讀取本地化字符串,但我們使用的修改版本也可以從Excel文件中讀取這些字符串。 它通過使用Microsoft OLE DB驅動程序打開OleDbConnection並通過它讀取字符串來實現。 在調試器中,我可以看到所有的值都被讀得很好。

當一位同事找到“切斷文本”問題的解決方案時,我真的很驚訝。 他重新排序了Excel表格中的行。 我不明白這是如何相關的,但在該文件的兩個版本之間切換會對該問題產生影響。

這確實有意義,這是因為Excel的ole db驅動程序必須在列中獲取數據樣本以為其分配類型,在字符串的情況下,也是長度。 如果它僅采樣低於255個字符閾值的值,您將獲得字符串(255)類型和截斷文本,如果它已采樣較長的字符串,則會將其指定為備注列並允許檢索/存儲更長的字符串。 通過重新排序,您將更改采樣的行。

如果您使用oledb將SQL Server讀取到Excel,您會發現這是一個已知問題。 http://msdn.microsoft.com/en-us/library/ms141683.aspx - 由於您使用相同的ole db驅動程序,我希望情況也適用於您。

來自文檔:

截斷文本。 當驅動程序確定Excel列包含文本數據時,驅動程序將根據其采樣的最長值選擇數據類型(字符串或備忘錄)。 如果驅動程序未在其采樣的行中發現長度超過255個字符的任何值,則會將該列視為255個字符的字符串列而不是備注列。 因此,可能會截斷超過255個字符的值。 要從備注列導入數據而不截斷,必須確保至少一個采樣行中的備注列包含長度超過255個字符的值,或者必須增加驅動程序采樣的行數以包含此類行。 您可以通過增加HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Jet \\ 4.0 \\ Engines \\ Excel注冊表項下的TypeGuessRows的值來增加采樣的行數。 有關更多信息,請參閱PRB:從Jet 4.0 OLEDB源傳輸數據失敗,錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM