2009-02-09 123 views
4

我使用Delphi函數什麼是代碼頁0?

StringCodePage 

我把它由一個COM函數返回一個字符串(譯註的Acrobat getContents - 看到我的其他職位),並返回0

什麼是0?安思?

+1

`StringCodePage()`返回0的唯一方法是,如果你傳遞一個空的`AnsiString`給它,或者在它的有效載荷中有一個非空白的`AnsiString`代碼頁。 Delphi對COM字符串使用`WideString`。在D2009中,RTL並沒有將實際的代碼頁值存儲到`AnsiString`有效負載中做得非常好,所以它通常具有0,因爲這是編譯時代碼頁的親和性,而不是運行時親和性。這在後來的Delphi版本中得到了修復。 – 2012-07-05 09:27:39

回答

8

代碼頁0是CP_ACP,即當前的Windows ANSI代碼頁。

從Windows.pas:

{$EXTERNALSYM CP_ACP} 
CP_ACP     = 0;    { default to ANSI code page } 

MSDN

CP_ACP

當前系統的Windows ANSI代碼頁。即使在同一個網絡上,這個值在不同的 計算機上也可能不同。它可以在同一臺計算機上更改,導致存儲的數據無法恢復損壞。該值僅用於暫時使用 ,如果可能,應使用UTF-16或UTF-8進行永久存儲。

3

的唯一途徑StringCodePage()可以返回0,如果你傳遞一個空白AnsiString,從而恢復其編譯時的代碼頁親和力,或傳遞一個非空AnsiString有分配給它的有效載荷代碼頁0。 Delphi使用WideString作爲COM字符串,而StringCodePage()對於除了普通AnsiString之外的任何字符串類型都不會返回0。在D2009中,RTL在將操作系統的實際運行時代碼頁存儲到AnsiString有效負載中做得並不出色,因此它們通常包含編譯時代碼頁的親和性0.這對於字符串轉換而言是功能性的,但它不是非常明確。這在以後的Delphi版本中得到修復,因此AnsiString有效載荷現在包含在運行時確定的實際操作系統代碼頁。