Supposons qu'il y ait seulement Norme C99 le papier et printf
doit être implémentée conformément à cette norme pour fonctionner avec l'encodage UTF-16, pourriez-vous clarifier le comportement attendu de la fonction de bibliothèque s
conversion avec précision spécifiée ?
la norme C99 (7.19.6.1) pour les s
la conversion dit :
Si aucun modificateur de longueur l n'est présent, l'argument doit être un pointeur vers l'élément initial d'un tableau de type caractère. Les caractères du tableau sont écrits jusqu'au caractère nul final (mais sans l'inclure). Si la précision est spécifiée, le nombre d'octets écrits ne dépasse pas ce nombre. Si la précision n'est pas spécifiée ou si elle est supérieure à la taille du tableau, le tableau contient un caractère nul.
Si un modificateur de longueur l est présent, l'argument doit être un pointeur vers l'élément initial d'un tableau de type wchar_t. Les caractères larges du tableau sont convertis en caractères multi-octets (chacun comme s'il s'agissait d'un appel à la fonction wcrtomb, avec l'état de conversion décrit par un objet mbstate_t initialisé à zéro avant la conversion du premier caractère large) jusqu'à et y compris un caractère large nul final. Les caractères multi-octets résultants sont écrits jusqu'à (mais sans inclure) le caractère nul de fin (octet). Si aucune précision n'est spécifiée, le tableau doit contenir un caractère large nul. Si une précision est spécifiée, le nombre d'octets écrits ne dépasse pas ce nombre (y compris les séquences de décalage, le cas échéant), et le tableau doit contenir un caractère large nul si, pour égaler la longueur de la séquence de caractères multi-octets donnée par la précision, la fonction doit accéder à un caractère large situé une fois au-delà de la fin du tableau. En aucun cas, un caractère multi-octet partiel n'est écrit.
Je ne comprends pas bien ce paragraphe en général et l'affirmation "Si une précision est spécifiée, pas plus que ce nombre d'octets ne sont écrits" en particulier.
Par exemple, prenons la chaîne UTF-16 "TEST" (séquence d'octets : 0x54, 0x00, 0x45, 0x00, 0x53, 0x00, 0x54, 0x00).
Ce qui doit être écrit dans le tampon de sortie dans les cas suivants :
- Si précision est de 3
- Si précision est 9 (un octet de plus que la longueur de la chaîne)
- Si précision est 12 (plusieurs octets de plus que la longueur de la chaîne)
Puis il y a aussi "Les caractères larges du tableau sont convertis en caractères multi-octets". Cela signifie-t-il que l'UTF-16 doit être converti en UTF-8 en premier ? C'est assez étrange dans le cas où je m'attends à travailler uniquement avec UTF-16.