Unicode libpcre2代码单位宽度

Unicode libpcre2代码单位宽度,unicode,utf-8,pcre,Unicode,Utf 8,Pcre,我一直在查看pcre2的手册页,并试图准确地找出哪些情况需要pcre2\u code\u UNIT\u WIDTH的哪些定义 PCRE2的源代码可以编译为支持8位、16位或 32位代码单元,这意味着最多可以使用三个独立的库 安装 问题1:PCRE2的代码单位到底是什么?这是否意味着我需要使用PCRE2\u code\u UNIT\u WIDTH 8来处理char*而不是PCRE2\u code\u UNIT\u WIDTH 32来处理wchar*?如果我的平台的wchar是16位怎么办?这是否需

我一直在查看
pcre2
的手册页,并试图准确地找出哪些情况需要
pcre2\u code\u UNIT\u WIDTH
的哪些定义

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

问题1:PCRE2的代码单位到底是什么?这是否意味着我需要使用
PCRE2\u code\u UNIT\u WIDTH 8
来处理
char*
而不是
PCRE2\u code\u UNIT\u WIDTH 32
来处理
wchar*
?如果我的平台的
wchar
是16位怎么办?这是否需要有条件地使用PCRE2\u代码\u单位\u宽度16?如果这是真的,似乎根据我的想法,我需要使用
PCRE2\u code\u UNIT\u WIDTH=8*\uuuu SIZEOF\u WCHAR\u T\uuu

关于Unicode主题:

在这三种情况下,字符串可以解释为每个代码单元一个字符,也可以解释为UTF编码的Unicode,并支持Unicode常规类别属性。Unicode支持在构建时是可选的(但是是默认的)。但是,必须在运行时显式启用将字符串作为UTF代码单元进行处理

问题2:启用Unicode时,PCRE2编码单位宽度的确切含义是什么?
PCRE2\u code\u UNIT\u WIDTH 8
是否接受UTF-8,我需要设置
PCRE2\u code\u UNIT\u WIDTH 16
来处理UTF-16字符串

PCRE2的代码单元到底是什么

以下是PCRE2用于其代码单元定义的内容(在
PCRE2.h
中):

/*模式和主题字符串中代码单元的类型*/
类型def uint8_t PCRE2_UCHAR8;
类型定义uint16\u t PCRE2\u UCHAR16;
类型定义uint32\u t PCRE2\u UCHAR32;
类型定义常量PCRE2_UCHAR8*PCRE2_SPTR8;
类型定义常量PCRE2_UCHAR16*PCRE2_SPTR16;
类型定义常量PCRE2_UCHAR32*PCRE2_SPTR32;
因此,您可以看到PCRE2在发动机罩下使用
uintX\u t
,而不是
char
/
wchar\u t

请注意,当您将
PCRE2\u code\u UNIT\u WIDTH
定义为8、16或32时,
PCRE2\u UCHAR
PCRE2\u SPTR
将被定义为正确的变量

因此,是的,
PCRE2\u code\u UNIT\u WIDTH=8*\u大小的WCHAR\u T\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果您想编写可移植代码,请避免使用它,UTF-8只需使用
char
/
uint8\u t
,UTF-16只需使用
uint16\u t
,UTF-32只需使用
uint32\u t

不要将代码单元与代码点混淆,因为编码单个代码点可能需要几个代码单元

启用Unicode时,
PCRE2\u code\u UNIT\u WIDTH
的确切含义是什么?
PCRE2\u code\u UNIT\u WIDTH 8
是否接受UTF-8,我需要设置
PCRE2\u code\u UNIT\u WIDTH 16
来处理UTF-16字符串

对。如果需要在程序中处理多个编码,还可以将
PCRE2\u code\u UNIT\u WIDTH
设置为0。您将丢失别名,例如
pcre2\u match
,您必须调用
pcre2\u match\u 8
pcre2\u match\u 16