【问题标题】:libpcre2 Code Unit Widthlibpcre2 代码单元宽度
【发布时间】:2018-03-31 03:13:53
【问题描述】:

我一直在查看pcre2 的手册页,并试图准确找出哪些情况需要PCRE2_CODE_UNIT_WIDTH 的哪些定义。

PCRE2 的源代码可以编译为支持 8 位、16 位或 32 位代码单元,这意味着最多三个独立的库可以 安装。

问题一: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__

关于 Unicode 的话题:

在所有这三种情况下,字符串都可以解释为每个代码单元一个字符,或者解释为 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 字符串?

【问题讨论】:

    标签: unicode utf-8 pcre


    【解决方案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 将 #defined 为正确的变体。

    所以是的,PCRE2_CODE_UNIT_WIDTH = 8 * __SIZEOF_WCHAR_T__ 乍一看似乎是合理的,但是 wchar_t is not meant to handle Unicode data。如果您想编写可移植代码,请避免使用它,只需将 char/uint8_t 用于 UTF-8,uint16_t 用于 UTF-16,uint32_t 用于 UTF-32。

    不要将 代码单元代码点 混淆,因为可能需要多个代码单元来编码单个代码点。

    启用 Unicode 时,PCRE2_CODE_UNIT_WIDTH 到底是什么意思? 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-21
      • 2015-05-04
      • 2017-08-14
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2012-09-18
      相关资源
      最近更新 更多