2017-10-19 10 views
1

J'ai regardé la page man pour pcre2, et j'essaie de comprendre précisément quelles situations nécessitent quelles définitions de PCRE2_CODE_UNIT_WIDTH.libpcre2 Code Unité Largeur

Le code source pour PCRE2 peut être compilé pour supporter 8 bits, 16 bits ou unités de code de 32 bits, ce qui signifie que jusqu'à trois bibliothèques séparées peuvent être installés .

Question 1: Quelle est exactement l'unité de code de PCRE2? Est-ce que cela signifie que j'ai besoin d'utiliser PCRE2_CODE_UNIT_WIDTH 8 pour gérer char* par rapport à PCRE2_CODE_UNIT_WIDTH 32 pour wchar *? Que se passe-t-il si le numéro wchar de ma plateforme est 16 bits? cela nécessiterait-il conditionnellement l'utilisation de PCRE2_CODE_UNIT_WIDTH 16? Si cela est vrai, il semble que selon How big is wchar_t with GCC? je besoin d'utiliser le PCRE2_CODE_UNIT_WIDTH = 8 * __SIZEOF_WCHAR_T__

Sur le thème de l'Unicode:

Dans les trois cas, les chaînes peuvent être interprétés soit comme un caractère par unité de code , ou comme Unicode codé en UTF, avec prise en charge des propriétés de catégorie générale Unicode. La prise en charge d'Unicode est facultative au moment de la construction (mais c'est la valeur par défaut). Cependant, le traitement des chaînes comme unités de code UTF doit être activé explicitement au moment de l'exécution.

Question 2: Que signifie exactement PCRE2_CODE_UNIT_WIDTH signifie quand Unicode est activé? Est-ce que PCRE2_CODE_UNIT_WIDTH 8 prend UTF-8, et je dois régler PCRE2_CODE_UNIT_WIDTH 16 pour gérer une chaîne UTF-16?

Répondre

1

Qu'est-ce que c'est exactement l'unité de code de PCRE2?

Voici ce que PCRE2 utilise pour ses définitions des unités de code (en 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; 

Vous pouvez donc voir que PCRE2 utilise uintX_t sous le capot au lieu de char/wchar_t.

Notez que lorsque vous définissez PCRE2_CODE_UNIT_WIDTH à 8, 16 ou 32, PCRE2_UCHAR et PCRE2_SPTR sera # défini pour la variante correcte.

Alors oui, PCRE2_CODE_UNIT_WIDTH = 8 * __SIZEOF_WCHAR_T__ semble raisonnable à première vue, mais wchar_t is not meant to handle Unicode data. Évitez-le si vous voulez écrire du code portable, et utilisez simplement char/uint8_t pour UTF-8, uint16_t pour UTF-16 et uint32_t pour UTF-32.

Ne confondez pas unités de code avec points de code, comme plusieurs unités de code peuvent être nécessaires pour coder un seul point de code.

Que signifie exactement PCRE2_CODE_UNIT_WIDTH lorsque Unicode est activé? Est-ce que PCRE2_CODE_UNIT_WIDTH 8 prend UTF-8, et je dois régler PCRE2_CODE_UNIT_WIDTH 16 pour gérer une chaîne UTF-16?

Oui. Vous pouvez également définir PCRE2_CODE_UNIT_WIDTH sur 0 si vous devez gérer plusieurs encodages dans votre programme. Vous perdrez les alias comme pcre2_match, et vous devrez appeler pcre2_match_8 ou pcre2_match_16 par exemple.