libpcre2 代码单元宽度

Jim*_*mmy 4 unicode pcre utf-8

我一直在查看 的手册页pcre2,并试图准确地弄清楚什么情况需要 的哪些定义PCRE2_CODE_UNIT_WIDTH

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

问题1:PCRE2的代码单元到底是什么?这是否意味着我需要使用PCRE2_CODE_UNIT_WIDTH 8to 处理char*PCRE2_CODE_UNIT_WIDTH 32for 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 字符串?

Luc*_*ski 5

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;
Run Code Online (Sandbox Code Playgroud)

所以你可以看到 PCRE2uintX_t在幕后使用而不是char/ wchar_t

请注意,当您定义PCRE2_CODE_UNIT_WIDTH为 8、16 或 32 时,PCRE2_UCHARPCRE2_SPTR#define 为正确的变体。

所以是的,PCRE2_CODE_UNIT_WIDTH = 8 * __SIZEOF_WCHAR_T__乍一看似乎很合理, wchar_t并不意味着处理 Unicode 数据。如果您想编写可移植代码,请避免使用它,只需使用char/表示uint8_tUTF-8、uint16_tUTF-16 和uint32_tUTF-32。

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

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例如。