Je suis principalement intéressé par les systèmes de type UNIX (par exemple, POSIX portable) comme il semble que Windows fait des choses étranges pour des caractères larges. P>
Faites les fonctions de caractères de lecture et d'écriture d'écriture (comme Cependant, je ne suis pas sûr si cela est garanti. Par exemple, CProgramming.com stipule que: p>
[caractères larges] ne doit pas être utilisé pour la sortie, puisque zéro parasite
octets et autres caractères Low-ASCII avec des significations communes (telles que '/'
et '\ n') sera probablement saupoudré dans les données. P>
blockQuote>
qui semble indiquer que la sortie des caractères larges (en utilisant probablement les fonctions de sortie de caractères larges) peut faire des ravages. P>
Puisque la norme C ne semble pas mentionner le codage du tout, je n'ai vraiment aucune idée de qui / quand / comment le codage est appliqué lors de l'utilisation de wchar_t. Donc, ma question est essentiellement si la lecture, l'écriture et l'utilisation de caractères larges exclusivement sont une bonne chose à faire lorsque mon application n'a pas besoin de savoir sur le codage utilisé. Je n'ai besoin que de longueurs de chaîne et de largeurs de la console ( getwchar () code> et
putwchar () code>) toujours "faire la bonne chose", par exemple en lecture de UTF-8 et écrire à UTF-8 quand c'est la locale définie, ou dois-je appeler manuellement
wcrtomb () code> et imprimer la chaîne en utilisant par exemple
fputts () code>? Sur mon système (opensuse 12.3) où
$ lang code> est défini sur
EN_GB.UTF-8 code> Ils semblent faire la bonne chose (inspectant la sortie que je vois ce qui ressemble à UTF -8 Même si des chaînes ont été stockées avec WCHAR_T et écrit à l'aide des fonctions de caractère larges). P>
wcswidth () code>), donc à moi en utilisant WCHAR_T partout lors de la gestion du texte semble idéal. P>
3 Réponses :
n'utilise pas Si vous souhaitez écrire, disons UTF8, utilisez une fonction qui renvoie la taille réelle utilisée par la chaîne UTF8 et utilisez Fwrite pour écrire le bon nombre d'octets, sans vous soucier de vicieux ' fputts code> avec quelque chose d'autre que ASCII. P>
\ 0 code> 'à l'intérieur de la chaîne. p>
Bienvenue dans le débordement de pile. FLCTS () CODE> sortira une chaîne d'octets vers le premier octet zéro. UTF-8 ne contient qu'une seule valeur de caractère avec un octet zéro, et c'est u + 0000 (codé comme
'\ 0' code> dans utf-8). Donc,
fputts () code> ne manipule pas une chaîne UTF-8 terminée null. En effet, l'un des mérites de l'UTF-8 est qu'un programme Nazze qui n'est pas au courant de l'UTF-8 peut souvent gérer les cordes correctement. (Pas toujours - il y a beaucoup de façons de causer des problèmes; mais souvent ...) aussi,
fputts () code> convient aux codes de code mono-octets tels que ISO 8859-1 ou 8859-15 (8859 -2, ...). La limiter à ASCII est injustifiable.
Bonjour, il ne compile pas comme UTF8 complet. Il utilise la chaîne UTF8 en source compilée ASCII.
Et FLCTS échouera car UTF8 ne sont pas un octet codé des chaînes codées.
Mieux que cela devrait utiliser WCHAR et FUPTWS (const wchar_t * restreindre, fichier * restreindre);
Fallts () CODE> Ne manquera pas simplement parce que UTF8 est un jeu de code multi-octets. En effet, l'un des objectifs de la conception de l'UTF8 était de laisser les programmes naïfs qui ignorent l'UTF8 le traitent toujours avec succès. Votre affirmation selon laquelle
FLCTS () CODE> est seulement bon pour ASCII est flagrante de manière flagrante, même en prenant une interprétation de bienfaisance que vous voulez dire "un code mono-octet défini en fonction de l'ASCII, tel que 8859-1". Notez que UTF8 est un ensemble de code multi-octets (ou codage de caractères), pas un qui utilise des caractères larges; Vous ne manipuleriez pas UTF8 avec des fonctions de caractère large. UTF16 et UTF32 sont des représentations de caractère large de Unicode.
Maintenant, si vous essayez de discuter que vous ne pouvez pas utiliser fputts () code> pour sortir une chaîne de caractères largeur, alors je suis d'accord avec vous, mais ce n'est pas ce que votre réponse dit du tout. Votre réponse évite largement de répondre à la question actuelle, en fait.
Ma réponse dit ce qu'elle dit: l'écriture échouera. Qui signifie que le comportement ne sera pas ce qui a assisté. Pourquoi: à cause du codage. De plus, je ne suis pas celui qui se dispute là-bas. Tu es. \ 0 est zéro. Beaucoup de personnages ancrochés multi-octets auront un seul 0 dans un octet qui ne signifie plus d'écoute avec les fnstes.
Tant que la locale est définie correctement, il ne devrait pas y avoir de problèmes de traitement des fichiers UTF-8 sur un système à l'aide de UTF-8, à l'aide des fonctions de grande taille. Ils seront capables d'interpréter les choses correctement, c'est-à-dire qu'ils traiteront un caractère comme 1 à 4 octets si nécessaire (en entrée et en sortie). Vous pouvez le tester par quelque chose comme ceci:
char *stdtxt = "ASCII and UTF-8 â¬Â£Â¢"; wchar_t buf[100]; mbstowcs(buf, stdtxt, 20); wprintf(L"%ls has %zu wide characters\n", buf, wcslen(buf)); Output: ASCII and UTF-8 â¬Â£Â¢ has 19 wide characters
"Pause" n'est pas tout à fait juste. La description devrait être "la chaîne occupe 7 octets", ce qui est précis. Qu'il contient seulement 3 caractères est également correct. Ceci est une différence de partie entre chaînes multi-octets ( mbs * code> fonctions) et chaînes de caractères (
wcs * code> fonctions). Cependant, c'est la nitpicking; Votre réponse principale va bien.
@Jonathanleffler - Je venais d'éditer pour traiter ce que j'ai dit comme vous l'avez écrit.
@Jonathanleffler - heh, ça va. Je l'ai rempli un peu.
@teppic: Merci pour les exemples, votre réponse était également très bonne.
Utilisez STRNLEN code>, pas
SHLEN code>.
Le texte pertinent régissant le comportement des fonctions de STDIO de nature large et leur relation avec les paramètres régionaux provenait de POSIX XSH 2.5.2 Orientation des flux et Règles de codage: P>
http://pubs.opengroup.org/onlinepubs/9699919799/fonctions/v2_chap02.html # tag_15_05_02 p>
Fondamentalement, les fonctions STDIO de la grande caractéristique écrivent toujours dans l'encodage en vigueur (par la catégorie Cependant, une considération importante que vous ne devriez pas négliger, c'est que vous ne devez pas strong> Mélanger les octets et les opérations orientées larges sur le même fichier Vraiment, je ne peux penser à aucune raison d'utiliser des fonctions grandes orientées. LC_CTYPE CODE> LC_CTYPE) au moment où le fichier
le fichier code> devient grand-orienté; Cela signifie la première fois qu'une vaste fonction STDIO est appelée sur elle, ou
Awide code> est utilisé pour définir l'orientation sur large. Ainsi, aussi longtemps qu'un
LC_CTYPE CODE> LC_CTYPE CODE> correspondant à l'encodage "Système" souhaité (E.G. UTF-8) lorsque vous commencez à travailler avec le flux, tout devrait être bien. P>
code> flux. Ne pas respecter cette règle n'est pas une erreur à déclarer; Il en résulte simplement comportement non défini em>. Comme une bonne affaire de code de bibliothèque assume
stardr code> est orienté octet (et certains en font même la même hypothèse sur
stdout code>), je découragerais fortement jamais strong> en utilisant des fonctions grandes orientées sur les flux standard. Si vous le faites, vous devez faire très attention à quelles fonctions de la bibliothèque que vous utilisez. P>
Fprintf CODE> est parfaitement capable d'envoyer des chaînes de caractères larges aux flux de fichiers code> orientés par octets à l'aide du spécificateur
% ls code>. p>
Je suppose que l'utilisation de Putwchar (WC) donne une meilleure performance que de devoir utiliser Printf ("% LC", WC), mais pour mon utilisation actuelle que la différence de performance n'est probablement pas importante. Mais juste pour être clair, fixer STDOUT à une orientation large ne sera problématique que si les fonctions de la bibliothèque écrivent réellement sur stdout, correct?
@QuanTrumboredom: oui. stdout code> commence sans orientation, mais une fois que vous écrivez à l'aide d'une fonction de caractère large, il est défini sur large et que vous ne devez plus utiliser les fonctions d'octet dessus (
starr code> reste non affecté ). Je ne peux penser à aucune fonction de bibliothèque standard qui utilisera
stdout code>, mais les bibliothèques externes pourraient.
@teppic: OK, dans ma demande, tout ce que l'écriture de STDOUT serait un bogue de toute façon, et j'ai mesuré la performance de la moitié lors de l'utilisation de Printf ("% LC", WC) Versus putwchar (WC), donc je pense que je pense que je pense que je pense que Large sortie sur stdout. Merci de créer un lien avec la norme correspondante dans votre réponse :-)
@Quantubordom - c'était R .. :) j'ai mis à jour ma réponse avec votre question pour l'achèvement.
@teppic: ah, je n'ai pas remarqué. Merci à vous deux :-)