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 字符串?
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_UCHAR将PCRE2_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_8或pcre2_match_16例如。