2012-06-29 68 views
0

  1. 我已經改變了我的系統,以俄羅斯的代碼頁爲this site
  2. PC重啓
  3. 然後在解釋,我在一個目錄中創建的文件與含特殊名稱俄語字符
  4. 然後,我已經列在此目錄中的所有文件,並試圖顯示與典型的Delphi 7代碼的文件使用:

SearchRec: TSearchRec; 

    FindFirst 

    showmessage(SearchRec.Name); 

    FindNext(SearchRec); 
    FindClose(SearchRec); 

該代碼運行良好。ANSI應用和越南的代碼頁

當我用越南語而不是俄語重做所有4個步驟時,用showmessage顯示的文件名是不正確的。有些?出現代替(見截圖):

enter image description here

請幫

+3

您是否安裝了可顯示缺失字符的字體? – frogb

+0

我使用「showmessage」。我不知道使用了什麼字體。 但是,我認爲這是一個典型的Windows字體能夠顯示越南人字符 – user382591

+3

您的'ShowMessage'函數不能說Unicode ;-)和'TSearchRec'以及我猜。 – TLama

回答

1

這是由於在2009年之前版本的Delphi實現自己的string型的方式。這不是字體問題,而是字符編碼問題。

所有string變量,以及所有Windows API調用都使用ANSI編碼執行。使用ANSI,您一次只能使用一個代碼頁。爲了混合代碼頁(即混合俄語和越南語編碼),您需要處理文本並調用UNICODE Windows API。

以下是發生在你的情況:

  • 您創建的Windows俄語字符的文件,使用Unicode編碼;
  • 當您使用越南當前代碼頁讀取文件時,只能將前127個字符(即ASCII七個字符,例如數字,主要標點和英文字母)從UNICODE讀取到ANSI越南語中:在轉換過程中,所有不正確的字符都轉換爲?在你的ANSI越南語字符串中。

所以,你有幾種解決方法:

  • 升級到德爾福> = 2009,和您的string將是UNICODE,這樣你就可以混合字符集;
  • 使用widestring用於存儲文本,並直接調用窗口寬的API - 也就是說,你不能使用VCL單位,也不是FindFirst/FindNextSysUtils定義,也不ShowMessageDialogs定義。

當然,第一個是最簡單的!

+1

我想你已經誤解了這個問題。據我瞭解,OP將系統代碼頁更改爲越南語,然後創建一個名稱中包含越南文字符的文件,然後找到該文件並顯示其名稱。 –

+0

對吧! – user382591

+0

@SertacAkyuz該文件是在其名稱內使用**俄語**字符創建的,而不是越南語。這就是我的回答:當系統切換到越南語字符集時,讀取俄語字符是不可能的。兩種解決方法仍然適用。 –