2017-10-19 52 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

相关问题