2017-10-19 51 views
1

我一直在尋找pcre2的手冊頁,並試圖弄清楚什麼情況下需要PCRE2_CODE_UNIT_WIDTH的定義。libpcre2代碼單位寬度

爲PCRE2的源代碼可以被編譯爲支持8位,16位,或 32位代碼單元,這意味着最多三個獨立的文庫可以 安裝。

問題1:PCRE2的代碼單元究竟是什麼?這是否意味着我需要使用PCRE2_CODE_UNIT_WIDTH 8來處理char*PCRE2_CODE_UNIT_WIDTH 32對於wchar *?如果我的平臺的wchar是16位呢?那需要有條件地使用PCRE2_CODE_UNIT_WIDTH 16?如果這是真的,好像根據How big is wchar_t with GCC?我會需要使用PCRE2_CODE_UNIT_WIDTH = 8 * __SIZEOF_WCHAR_T__

在統一的主題:

在這三種情況下,字符串可以解釋無論是作爲每個代碼單元中的一個字符,或者作爲UTF編碼的Unicode,支持Unicode通用類別屬性。 Unicode支持在構建時是可選的(但是是默認的)。但是,處理字符串作爲UTF代碼單元必須在運行時顯式啓用。

問題2:究竟是支持Unicode時PCRE2_CODE_UNIT_WIDTH是什麼意思? PCRE2_CODE_UNIT_WIDTH 8是否採用UTF-8,我需要設置PCRE2_CODE_UNIT_WIDTH 16來處理UTF-16字符串?

回答

1

PCRE2的代碼單元究竟是什麼?

這裏就是PCRE2用於其代碼單元定義(在pcre2.h):

/* Types for code units in patterns and subject strings. */ 

typedef uint8_t PCRE2_UCHAR8; 
typedef uint16_t PCRE2_UCHAR16; 
typedef uint32_t PCRE2_UCHAR32; 

typedef const PCRE2_UCHAR8 *PCRE2_SPTR8; 
typedef const PCRE2_UCHAR16 *PCRE2_SPTR16; 
typedef const PCRE2_UCHAR32 *PCRE2_SPTR32; 

所以你可以看到,PCRE2使用uintX_t引擎蓋,而不是char/wchar_t下。

請注意,當您將PCRE2_CODE_UNIT_WIDTH定義爲8,16或32時,PCRE2_UCHARPCRE2_SPTR將被定義爲正確的變體。

所以是的,PCRE2_CODE_UNIT_WIDTH = 8 * __SIZEOF_WCHAR_T__乍一看似乎是合理的,但是wchar_t is not meant to handle Unicode data。如果您想編寫便攜式代碼,請避免使用它,並且對於UTF-8使用char/uint8_t,對於UTF-16使用uint16_t,對UTF-32使用uint32_t

不要混淆代碼單元代碼點,幾個代碼單元可以要求編碼單碼點。

PCRE2_CODE_UNIT_WIDTH在啓用Unicode時意味着什麼? PCRE2_CODE_UNIT_WIDTH 8是否採用UTF-8,我需要設置PCRE2_CODE_UNIT_WIDTH 16來處理UTF-16字符串?

是的。如果您需要在程序中處理多個編碼,您也可以將PCRE2_CODE_UNIT_WIDTH設置爲0。您將失去像pcre2_match這樣的別名,例如,您必須致電pcre2_match_8pcre2_match_16

相關問題