Ceci est une question vraiment longue durée de mon travail, que je réalise que je toujours em> ne pas avoir une bonne solution à ... c naïvement défini toutes ses fonctions de test de caractère Pour un Int: p> mais les caractères sont souvent signés, et un caractère complet ne correspond souvent pas dans un int, ou dans une unité de stockage unique utilisée pour les chaînes * *****. P> et ces fonctions ont été le modèle logique des fonctions et des méthodes actuelles C ++ et définissez la scène de la bibliothèque standard actuelle. En fait, ils sont toujours pris en charge, Afaict. P> Donc, si vous maintenez la main Isspace (* pchar), vous pouvez vous retrouver avec des problèmes d'extension de signe. Ils sont difficiles à voir, et de là, ils sont difficiles à garder contre mon expérience. P> De même, parce que Isspace () et c'est tout de prenant dans l'INT, et parce que la largeur d'un personnage est souvent Inconnu W / O String-Analyse - ce qui signifie que toute bibliothèque de caractères moderne ne devait essentiellement jamais de carder autour de Char ou de Wchar_t, mais seulement des pointeurs / itérateurs, car seulement en analysant le flux de caractères, pouvez-vous savoir à quel point cela compose un seul caractère logique, je suis à un peu de perte quant à la meilleure façon de s'approcher des problèmes? P> Je continue à vous attendre à une bibliothèque véritablement robuste basée sur une abstraction du facteur de taille de n'importe quel personnage et de travailler uniquement avec des chaînes (offrant une telle Les choses comme Isspace, etc.), mais que l'on m'a manquait, sinon une autre solution plus simple me fixe au visage que vous avez tous (qui savez ce que vous faites) utilisez ... P> ** Ces problèmes ne figurent pas pour des codages de caractères de taille fixe pouvant entièrement contenir un caractère complet - UTF-32 apparemment est ABO UT la seule option qui présente ces caractéristiques (ou des environnements spécialisés qui se limitent à ASCII ou à une autre). P> "Comment testez-vous Pour WhitSpace, Isprinctable, etc., d'une manière qui ne souffre pas de deux questions: p> 1) Signe expansion et Après tout, la plupart des codages de caractères EM> sont une largeur variable: UTF-7, UTF-8, UTF-16, ainsi que les normes plus anciennes telles que comme shifting-jis. Même l'ASCII prolongé peut avoir le simple problème d'extension de signe si le compilateur traite le char comme une unité de 8 bits signée. P> Peu importe la taille de votre char_type, c'est faux Pour la plupart des systèmes de codage de caractères. P> Ce problème se trouve dans la bibliothèque C standard C, ainsi que dans les bibliothèques standard C ++; qui essaie toujours de transmettre de char et wchar_t, plutôt que des itérateurs à cordes dans les différents implémentations de l'ISSPACE, ISPRTT, etc. Mise en œuvre. P> En fait, c'est précisément ce type de fonctions qui brisent la généricité de STD :: String . Si cela n'a fonctionné que dans des unités de stockage et n'a pas essayé de prétendre comprendre la signification des unités de stockage en tant que caractères logiques (tels que Isspace), l'abstraction serait beaucoup plus honnête et obligerait les programmeurs américains à regarder Ailleurs pour des solutions valides ... p> Tous ceux qui ont participé. Entre cette discussion et wchars, codages, normes et portabilité J'ai un bien meilleur gérant sur les problèmes. Bien qu'il n'y ait pas de réponses simples, chaque compréhension aide. P> p>
Donc, ma question est la suivante: h2>
2) Problèmes de caractères de largeur variable p> Veuillez noter: H2>
Merci h2>
8 Réponses :
Comment testez-vous pour WhitSpace, Isprompttable, etc., d'une manière qui ne souffre pas de deux questions:
1) Signer l'expansion de
2) Problèmes de caractères à largeur variable
Après tout, tous les codages Unicode couramment utilisés sont une largeur variable, que les programmeurs se rendent compte ou non: UTF-7, UTF-8, UTF-16, ainsi que les normes plus anciennes telles que Shift-JIS ... P> blockQuote>Évidemment, vous devez utiliser une bibliothèque d'unicode, car vous avez démontré (correctement) que la bibliothèque standard C ++ 03 n'est pas. La bibliothèque C ++ 11 est améliorée, mais elle n'est toujours pas assez bonne pour la plupart des usages. Oui, certains OS 'ont un WCHAR_T 32 bits qui les rend capables de gérer correctement UTF32, mais c'est une implémentation et n'est pas garantie par C ++ et n'est pas suffisamment suffisante pour de nombreuses tâches unicodes, telles que itération des graphèmes (lettres) . p>
ibmicu
libiconv
microitf-8
UTF-8 CPP, version 1.0
UTFProc
et beaucoup plus chez http://unicode.org/resources/libraires.html . P >Si la question est inférieure à des tests de caractère spécifiques et d'autres points concernant les pratiques de code en général: faites tout ce que votre cadre fait. Si vous codez pour Linux / QT / Networking, gardez tout à l'intérieur de l'UTF-8. Si vous codez avec Windows, gardez tout à l'intérieur de l'UTF-16. Si vous avez besoin de vous gâcher avec des points de code, gardez tout à l'intérieur de l'UTF-32. Sinon (pour le code générique portable), faites ce que vous voulez, car peu importe ce que vous devez traduire certains OS ou tout autre. P>
C'est faux. Standard C ++ fait i> Soutenir Unicode, par l'intermédiaire de littéraux et via la bibliothèque standard. De plus, Char code> est défini de manière à ce qu'il faut accueillir pour cela.
L'un des principaux problèmes pour nous avec UTF-32 serait que les API OS (Win32 dans notre cas) ne gèrent pas ceux-ci. Nous devrions donc convertir constamment la sortie et l'entrée dans le système d'exploitation entre UTF-16 (largeur variable) et UTF-32. [Je m'attends également à ce que ce soit l'une de ceux qui se rendent à l'échec: finalement Unicode aura besoin de plus de 32 bits, et le code de tous sera brisé - alors pourquoi pas seulement les caractères variables à la largeur de la variables à droite 1/2, par toutes les différentes langues?]
@WILELMMTELL: Il soutient des littéraux, des caractères de diverses largeurs et des conteneurs pour lesdites caractères, mais ce n'est pas assez bon pour de nombreuses fins.
@MORDACACHAI: Parce qu'il y a NO i> Norme existante qui peut gérer un nombre infini de caractères (que j'ai entendu parler de), et les responsables des normes ont convenu que nous aurons jamais besoin de plus de 0x10ffff.
@MOOINGDUCK: UTF-8 (Contrairement à UTF-16) peut être étendu indéfiniment. C'est juste une limite artificielle.
@ybungalobillillillillillillillillill: le schéma d'encodage UTF-8 est limité à 31 bits codé dans 6 octets si vous adhérez aux restrictions suivantes: (1) 0xfe et 0xFF sont invalides (2) la longueur de la séquence peut être déterminée à partir du premier octet
@MOOINGDUCK: Les Hubris dans "Les pouvoirs qui ont décidé qu'ils n'auront jamais besoin de plus que ..." est intense. Il est garanti d'avoir tort. Tout comme 7 bits était plus que suffisant ... jusqu'à ce que ce ne soit pas. Il en va de même pour toute dimension fixe: et seulement devenir plus gros rend les inefficacités des cas communs flagrants. ;)
@Mordachai: convenu, mais complètement hors sujet. Lorsque l'humanité arrive aussi loin, nous remplacerons les formats UNICODE actuels avec quelque chose de complètement non liée, il n'ya donc aucun moyen de planifier pour cela maintenant. Tout ce que vous pouvez faire est de travailler avec ce qui existe déjà. Dont nous avons déjà répondu pour vous.
En fait, je viens de calculer qu'avec toutes les langues et symboles aléatoires jamais utilisés (y compris Klingon), le consortium Unicode n'a attribué qu'environ 9,78% des points de code. Comme cela vient de ~ 2011 d'années d'écriture d'échantillons, nous pouvons extrapoler que le codage d'unicode actuel devrait nous retenir pendant environ 18543 ans de plus.
Nous obtenons de tels sujettes (mes excuses) - mais les informations grandissent de manière exponentielle. Si vous avez utilisé cet argument pour prédire la quantité de RAM, nous aurions jamais besoin de la base de l'IBM-PC, nous n'avions jamais dépassé 16 bits. La même chose a été pensée lorsque 32 bits IP ont été conçus: n'avez jamais besoin de plus - une gamme massive - bien-être au-delà des attentes les plus sauvages de quiconque ... Mais nous changeons contre 32 bits. C'est juste la nature des informations pour se développer de manière exponentielle.
@MORDACACHAI: (a) À peu près, que croyez-vous que le délai de doublement dans des années pour être pour le nombre de personnages d'alphabets qu'il vaut pratiquement à l'appui à Unicode? (b) Quand prévoyez-vous des adresses IPv6 à court et où est votre question équivalente demandant comment écrire des piles TCP pour faire face au fait que les adresses de réseau ne peuvent pas raisonnablement être une largeur fixe? ;-)
@Mordachai: Je ne sais pas si la langue tombe dans cette catégorie. Je penserais à l'internationalisation, à une alphabétisation généralisée et à une communication immédiate, j'attendrais que les langues changent plus lentes i> que dans le passé. J'avoue que cela est possible que je me trompe assez.
@ Christoph: Nous n'avons pas besoin des deux exigences, ils peuvent être abandonnés si nous devons étendre UTF-8 (d'accord, nous n'aurons pas vraiment besoin de).
Ok les gens ... Il est temps de déplacer cela dans une salle de discussion. Les commentaires ne sont pas destinés à une discussion prolongée. Merci
Je n'ai tellement pas testé les capacités d'internationalisation de la bibliothèque QT, mais d'après ce que je sais, Qstring est entièrement cotisé unicode et utilise QChar's qui sont des caractères unicode. Je ne connais pas la mise en œuvre interne de ceux-ci, mais je m'attends à ce que cela implique que QCar soit des caractères de taille varaisibles. P>
Il serait bizarre de se lier à un tel cadre important que QT juste d'utiliser des cordes cependant. P>
Ouais, ce serait surtout que depuis que nous avons du code qui utilise C-Library, C ++ STD :: Bibliothèque, MFC CStrings et Win32 API déjà! Yeesh - J'ai besoin d'une seule chaîne, véritablement correcte et robuste. :)
QString est facilement convertible en provenance et à std :: string et std :: wstring en utilisant les codecs de localisation. Ceux à convertir leur tour facilement à c-strings qui fonctionnent bien avec l'API win32. Le seul que je ne sais pas beaucoup sur les chaînes sont MFC, mais je suis sûr que la conversion est possible. De toute façon pourquoi tant de formats différents? Utilisez-vous les différentes bibliothèques / code-pièces dans un projet?
Il est dans tous les cas invalides pour passer une valeur négative autre que EOF à C'est vraiment la trivia, cependant, car les macros de caractères standard ne couvrent pas UNICODE, ni encodages multi-octets. Si vous souhaitez gérer correctement Unicode, vous avez besoin d'une bibliothèque Unicode. Je n'ai pas examiné ce que C ++ 11 ou C1X fournit à cet égard, à part que c ++ 11 a Ce peut être (je spéculer) qu'une base de données de classification Unicode «complète» est si grande et sujette à modifier qu'elle serait impratible pour la norme C ++ pour mandater le support «complet» de toute façon. Cela dépend dans une certaine mesure quelles opérations devraient être soutenues, mais vous ne pouvez pas vous échapper du problème que l'Unicode a traversé 6 versions majeures de 20 ans (depuis la première version standard), tandis que C ++ a eu 2 versions majeures en 13 ans. . En ce qui concerne C ++, l'ensemble des caractères UNICODE est une cible en mouvement rapide, il va donc toujours être défini par la mise en œuvre du code indiquant le système le sait. P>
En général, il existe trois façons correctes de gérer le texte UNICODE: P>
à tous les E / S (y compris les appels système qui renvoient ou acceptent les chaînes), convertissez tout entre un codage de caractères utilisé de manière externe et un codage interne à largeur fixe. Vous pouvez penser à cela comme une "désérialisation" sur l'entrée et la "sérialisation" sur la sortie. Si vous avez eu un type d'objet avec des fonctions pour le convertir / à partir d'un flux d'octets, vous ne mélangez pas le flux d'octets avec les objets ou examineriez des sections de flux d'octets pour des extraits de données sérialisées que vous pensez reconnaître. Il n'est pas nécessaire d'être différent pour cette classe de chaîne unicode interne. Notez que la classe ne peut pas em> être mess avec un mélange ad-hoc de séquences d'octets et de séquences unicodes, suivis soigneusement, ce qui est lequel. C'est comme (1), mais généralement plus difficile, et bien que cela soit potentiellement correct, dans la pratique, cela pourrait tout aussi facilement sortir. P> LI>
(Objectifs spéciaux uniquement): Utilisez UTF-8 pour tout. Parfois, cela est assez bon, par exemple si tout ce que vous faites est d'analyser une entrée basée sur des marques de ponctuation ASCII et de concaténer des chaînes de sortie. Fondamentalement, cela fonctionne pour les programmes où vous n'avez pas besoin de comprendre quoi que ce soit avec le sommet du bit supérieur, laissez-le simplement sur inchangé. Cela ne fonctionne pas si bien si vous avez besoin de faire du texte, sinon faites les choses que l'homme considérerait "évident" mais sont en réalité complexes. Comme une assiette. P> li>
ol> Isspace code> et les autres macros de caractères. Si vous avez un
Char c code>, et que vous souhaitez tester s'il s'agit d'un espace ou non, do
Isspace ((non signé) c) code>. Cela traite de l'extension (par zéro s'étendant).
ISSPACE (* PCHAR) CODE> est un problème plat - ne l'écrivez pas, ne laissez pas le laisser rester quand vous le voyez. Si vous vous entraînez à paniquer lorsque vous le voyez, il est moins difficile de voir. P>
fgetc. / code> (par exemple) renvoie déjà EOF ou un caractère lu sous la forme d'un
sans signé caractère code>, puis converti en
int code>, donc il n'y a pas de Problème d'extension des signes pour les valeurs de cela. P>
std :: u32tring code> qui semble prometteur. Avant que la réponse consiste à utiliser quelque chose de spécifique à la mise en œuvre ou à une tierce partie. (ONU) Heureusement, il y a beaucoup de bibliothèques à choisir. P>
std :: string code>, et pourrait ne pas être
std :: wstring code> soit, en fonction de la mise en œuvre. Tout simplement prétendre que la bibliothèque standard ne fournit pas de chaînes, si cela aide, ou utilisez un
std :: basic_string code> de quelque chose de gros comme le conteneur, mais une bibliothèque d'une cote d'unicode pour faire n'importe quoi sophistiqué. Vous devrez peut-être également comprendre la normalisation Unicode, pour faire face à des marques de combinaison et telles que telles que même dans une largeur fixe unicode codant, il peut y avoir plus d'un point de code par glyphe. P> li>
Je pense que la plupart des programmes Linux utilisent UTF-8 pour tout, car la plupart des bibliothèques Linux prennent UTF-8 et la plupart des programmes n'ont pas à faire beaucoup avec elle.
@MOOINGDUCK: Droite, car la plupart des programmes ne sont intéressés que par les chaînes de points de code, pas sur quoi que ce soit de manière extrêmement complexe. "Mots", par exemple. Si quelqu'un se demande comment utiliser Isspace code> correctement, et aussi vous demander à propos de Unicode, puis ils sont sur le territoire où UTF-8 ne facilement i> Go. Linux a la fuite que
wchar_t code> peut représenter un point de code UNICODE, qui est au moins un démarrage lorsque UTF-8 ne le fera pas.
Je pense que vous êtes confondre toute une foule de concepts non liés. P>
premier off, Le concept suivant est celui d'une chaîne de texte. À la Fondation, le texte est une séquence d'unités, qui sont souvent appelées «caractères», mais cela peut être plus impliqué que cela. À cette fin, la norme UNICODE standard est le terme "point de code" pour désigner l'unité la plus élémentaire de texte. Pour l'instant, et pour les programmeurs américains, "Text" est une séquence de points de code. P>
Le problème est qu'il y a plus de points de code que des valeurs d'octets possibles. Ce problème peut être surmonté de deux manières différentes: 1) Utilisez un codage Multi-octet em> pour représenter des séquences de point de code sous forme de séquences d'octets; ou 2) utilisez un type de données de base différent. C et C ++ offrent réellement Malheureusement, il n'y a rien de spécifique sur "le jeu de caractères du système" et "le codage multibyte de systèmes", de sorte que vous, comme tant de fois que les utilisateurs avant de vous, sont laissés à faire quoi faire avec ces mystérieux caractères. Ce que les gens veulent de nos jours sont un codage em> défini qu'ils peuvent partager sur des plates-formes. Le seul et unique codage utile que nous avons à cet effet est unicode em>, qui attribue une signification textuelle à un grand nombre de points de code (jusqu'à 2 21 sup> pour le moment) . En plus de l'encodage de texte, une famille de codages d'octets d'octets, UTF-8, UTF-16 et UTF-32. p>
La première étape pour examiner le contenu d'une chaîne de texte donnée est donc de le transformer de toute entrée que vous avez dans une chaîne de codage défini (Unicode). Cette chaîne unicode peut elle-même être codée dans l'un quelconque des formats de transformation, mais le plus simple est simplement comme une séquence de points de codes bruts (généralement UTF-32, puisque nous n'avons pas de type de données de 21 bits utile). P>
Effectuer cette transformation est déjà en dehors du cadre de la norme C ++ (même la nouvelle), nous avons donc besoin d'une bibliothèque pour le faire. Puisque nous ne savons rien de notre "jeu de caractères de système", nous avons également besoin de la bibliothèque pour gérer cela. P>
Une bibliothèque de choix populaire est À ce stade, notre voyage se termine. Nous pouvons désormais examiner le code de code de code par code de code (qui pourrait suffire à dire si quelque chose est un espace); Ou nous pouvons appeler une bibliothèque de traitement de texte plus lourde pour effectuer des opérations textuelles complexes sur notre flux de code de code Unicode (telle que la normalisation, la canonicalisation, la transformation présentation, etc.). Ceci est bien au-delà de la portée d'un programmeur à usage général et du domaine des spécialistes du traitement de texte. P> char code> est simplement un type de données. Son premier sens est "l'unité de stockage de base du système", c'est-à-dire "un octet". Sa signature est intentionnellement laissée à la mise en œuvre afin que chaque mise en œuvre puisse choisir la version la plus appropriée (c'est-à-dire prise en charge matérielle). C'est un nom, suggérant un "caractère", est probablement la seule pire décision de la conception du langage de programmation C. P>
wchar_t code> pour "le jeu de caractères du système", ainsi que les fonctions de traduction entre eux (
mbstowcs code> /
wcstombs code>) . p>
iconv () code>; La séquence typique passe de l'entrée multibyte
char * code> via
mbstowcs () code> à un
std :: wstring code> ou
wchar_t * code> wchar_t * code> wchar_t * code> Chaîne large, puis via
iconv () code> 's wchar_t-to-utf32 conversion vers un
std :: u32string code> ou
uint32_t * code> brut unicode codepoint Séquence. P>
"Le domaine des spécialistes du traitement de texte" - vrai. Et un peu déprimant, que la norme CS101, "inverse une chaîne" est au-delà de la connaissance d'un programmeur professionnel typique ...
@Stevejessop: Je pense que c'est juste un témoignage de la richesse de l'écriture humaine et donc de l'esprit humain. C'est très i> difficile à capturer cela numériquement! Mais nous n'avons été que depuis un peu plus d'une décennie, alors je pense que nous ne faisons pas trop mal. Gutenberg serait fier!
ish. Unicode sorte de définir pour fournir un codage commun que tout le monde peut utiliser. Mais le résultat réel est quelque chose que très peu de personnes peuvent utiliser correctement i>. Je ne pense pas que cela en fait un échec, comme vous le dites que c'est plus un cas de "tu vas avoir besoin d'un plus grand bateau". Une partie de celle-ci est juste que Unicode est mal comprise (y compris par moi, je ne prétends pas que je puisse faire cela non plus!), C'est que les gens pensent que "devrait être facile" qui ne le sont pas. En fait, je pense que le pansement autour des mots comme une "transformation présentation" est un excellent moyen de faire ressembler les choses difficiles comme elles sont difficiles.
Le problème que j'ai avec cette réponse (ce qui est correct aussi loin que possible) est qu'il ne se prête pas efficacement à une programmation de jours pratiques pour Windows. L'OS s'attend à ce que tout soit dans UTF-16, mais les E / S que nous avons besoin ont d'autres besoins et la bibliothèque STD C ++ ne gère pas vraiment UTF-16 correctement (par exemple. ESSPACE). Donc, je suis laissé se demander: qu'est une approche pratique que je puisse mettre en œuvre maintenant (ce qui est particulièrement difficile, étant donné que j'ai une base de code massif de code mixte 7 bits, 8 bits et 16 bits qui parle aux API écrits à diverses Étages de C, et plus tard C ++, Normes.
@MORDACACHAI: Vous écrivez simplement des interfaces propres et maintenez une grande discipline de codage. Vous choisissez un formulaire à maintenir en interne et vous ne faites que traiter avec des codages explicites dans des parties de feuilles spécifiques à une plate-forme abstraites, éventuellement à la plate-forme de votre code.
@KerReksB: Que POV a du sens pour moi lorsque l'E / S est relativement bien défini et externalisé (bordures claires). Et le fichier d'E / S a tendance à vous adapter à cela très bien. Mais pour une application de bureau Win32, je trouve que tenter de stocker des objets dans un format autre que ce que Windows veut d'excrétiser l'encombrant. Il infecte les ressources (des milliers de chaînes) que nous affichons à l'utilisateur, à l'interaction de l'interface graphique, etc. Donc, le choix d'une représentation interne autre que les MBC basés sur la région UTF-16 ou MS n'est pas très pratique pour une majorité du code.
@KerReksb: Ce qui signifie qu'un bon choix pratique est que nous choisissions de choisir UTF-16 (ou MBC actuel-locale). Mais cela me laisse toujours avec "Comment puis-je déterminer si le caractère de stockage suivant est imprimable ou non" - comme un besoin pratique et purement pratique dans les interactions interface graphique. Donc, je suis à la fois pour: obtenir une bibliothèque d'utiliser ces conversions + Fonctions de remplacement de base pour Isspace, Isprint, etc.
@MORDACACHAI: Pourquoi ne pas tout garder à l'intérieur comme wchar_t * code> ou
std :: wstring code>? Ensuite, vous pouvez l'utiliser directement dans Win32 (car les fenêtres fixent réellement des chaînes larges pour être codées UTF-16), et vous pouvez toujours utiliser
std :: Isspace (str, std :: locale ("")); code>.
+1 pour appeler "la seule pire décision dans la conception du langage de programmation C".
Vous semblez confondre une fonction définie sur ASCII 7 bits avec une fonction universelle de reconnaissance d'espace. Fonctions de caractère dans la norme C Utilisation Plan 9 tentative de résoudre ceci avec une bibliothèque UTF et l'hypothèse que toutes les données d'entrée sont UTF-8. Cela permet une certaine mesure de la compatibilité à l'envers avec ASCII, de sorte que les programmes non conformes ne meurent pas tous, mais permettent de rédiger de nouveaux programmes correctement. p>
La notion commune en C, même est toujours qu'un Travailler avec des tableaux de int code> ne pas gérer différents codages, mais pour permettre
eof code> d'être un indicateur hors bande. Il n'y a pas de problèmes avec l'extension de signalisation, car les chiffres que ces fonctions sont définies ne sont pas 8e. Fournir un octet avec cette possibilité est une erreur de votre part. P>
char * code> représente une gamme de lettres. Il devrait plutôt être considéré comme un bloc de données d'entrée. Pour obtenir les lettres de ce flux, vous utilisez
CharTorune () code>. Chaque
rune code> est une représentation d'une lettre (/ symbole / code de code), donc on peut enfin définir une fonction
Isspacerune () code>, qui vous dirait enfin quelles lettres sont des espaces. p>
Rune code> Comme vous le feriez avec
Char code> Tableaux, pour faire une manipulation de chaîne, appelez
runetochar () code> pour re-encoder vos lettres dans UTF-8 avant de l'écrire. P>
Compte tenu de l'existence de marques de combinaison, pour un rune code> pour représenter une lettre qu'il doit être capable de détenir une séquence de points de code.
Un commentaire à l'avance: Les anciennes fonctions C comme Maintenant à vos questions: p> 1) Signalisation expansion p> Les fonctions C ++ n'ont pas ce problème. En C ++, le
"Correct" de tester des choses comme si un personnage est
Un espace est de grapper le (compte tenu de l'influence de la STL, il est un peu surprenant que le
Standard n'a pas défini quelque chose comme ce qui précède en standard.) p> 2) Problèmes de caractère de largeur variable. P> Il n'y a pas de réponse réelle. Tout dépend de ce dont vous avez besoin. Pour certains
Applications, à la recherche de quelques personnages d'octets simples spécifiques est
suffisant et tout garder dans UTF-8 et ignorer le multi-octet
Problèmes, est une solution viable (et simple). Au-delà, il est souvent
utile à convertir en UTF-32 (ou en fonction du type de texte que vous êtes
traiter avec, utf-16) et utiliser chaque élément comme point de code unique. Pour
Manutention du texte intégral, d'autre part, vous devez faire face à
caractères points multi-codes, même si vous utilisez UTF-32: la séquence
Isspace code> ont pris
int code> pour
une raison: ils supportent
EOF code> comme entrée également, ils doivent donc pouvoir pouvoir être capable
Supporter une valeur de plus que celle qui sera adaptée dans un
char code>. Les
La décision "naïve" permettait à
char code> être signé - mais
le faire non signé aurait eu de graves implications de performance sur un
PDP-11.
std :: ctype code> facette de tous les endroits que vous voulez,
et pour l'utiliser. Bien sûr, la localisation C ++, en
locale code> argument a
De défaut à la locale mondiale n'est pas non plus la science de la fusée. Lancer un
Peu de type Tapedef et vous pouvez passer des choses comme
Isspace () code> à
std :: Trouver code>.
La seule sous-totalement gère la vie du
std :: ctype code> objet
vous traitez avec. Quelque chose comme ce qui suit devrait fonctionner, cependant: p>
\ u006D \ u0302 code> est un seul caractère (un petit
m code> avec un accent circonflexe sur
il). p> p>
Votre argument de préambule est quelque peu inacaturé et sans doute inéquitable, il n'est tout simplement pas dans la conception de la bibliothèque pour prendre en charge les codages Unicode - certainement pas plusieurs codages unicodes. p>
Développement des langues C et C ++ et une grande partie des bibliothèques pré-dater le développement de Unicode. De plus, les langues de niveau du système, ils nécessitent un type de données correspondant à la taille des mots adressable la plus petite de l'environnement d'exécution. Malheureusement, le type En outre, l'encodage variable des représentations Unicode le rend inutile d'un type de données intégré en tant que tel. Vous êtes évidemment au courant de cela que vous suggérez que les opérations de caractères Unicode soient effectuées sur des cordes plutôt que sur des types de mots de machine. Cela nécessiterait la prise en charge de la bibliothèque et comme vous le signiez, cela n'est pas fourni par la bibliothèque standard. Il y a un certain nombre de raisons pour cela, mais il ne s'agit que de pas dans le domaine de la bibliothèque standard, tout comme il n'y a pas de support de bibliothèque standard pour la mise en réseau ou les graphiques. La bibliothèque intrinsèquement ne résout pas tout ce qui n'est généralement pas universellement pris en charge par toutes les plates-formes cibles à partir du super-ordinateur. Toutes ces choses doivent être fournies par des bibliothèques système ou tiers. P>
Prise en charge de plusieurs codages de caractères concerne l'interopérabilité du système / environnement, et la bibliothèque n'est pas destinée à supporter cela non plus. L'échange de données entre les systèmes d'encodage incompatibles est un problème d'application et non un problème système. P>
"Comment testez-vous pour WhitSpace, Isprinctable, etc., d'une manière que
Ne souffre pas de deux questions: p>
1) Signe d'expansion et p>
2) Problèmes de caractère à largeur variable P>
blockQuote>
Isspace () considère que les 8 bits inférieurs. Sa définition indique explicitement que si vous passez un argument qui n'est pas représentable en tant que caractère non signé ou égal à la valeur de la macro eof em>, les résultats sont indéfinis. Le problème ne se pose pas si elle est utilisée comme prévu. Le problème est qu'il est inapproprié que vous puissiez l'appliquer à. P>
Après tout, tous les codages Unicode couramment utilisés sont une largeur variable,
Si les programmeurs le réalisent ou non: UTF-7, UTF-8, UTF-16, ainsi que
comme des normes plus anciennes telles que Shift-JIS P>
blockQuote>
Isspace () n'est pas défini pour UNICODE. Vous aurez besoin d'une bibliothèque conçue pour utiliser n'importe quel codage spécifique que vous utilisez. Cette question Quelle est la meilleure bibliothèque Unicode pour C? mai être pertinent. p> Char code> est devenu surchargé pour représenter à la fois l'ensemble de caractères de l'environnement d'exécution et le mot adressable minimum. C'est une histoire qui a montré que cela soit défectueux peut-être, mais la modification de la définition de la langue et la bibliothèque briserait une grande quantité de code hérité, de sorte que de telles choses sont laissées à des langages plus récents tels que c # qui a un
8 bits octet code> et distinct
type code> type. p>
-1 pour démontrer l'ignorance de l'UTF-8. L'OP a réellement établi la distinction appropriée entre un char code> 8 bits et un "caractère" étant une largeur variable. A C (++)
Char code> n'est pas un personnage! B>
@ DAN04: Je n'ai prétendu aucune connaissance de UTF8, j'ai délibérément dirigé clairement le sujet parce que je savais que je serais sur un terrain fragile; Pas beaucoup d'appel à celui-ci dans les systèmes embarqués que je développe. Cependant, vous avez raison, mais jusqu'à ce point, il n'avait même pas mentionné Unicode et semblait utiliser les termes interchangeables. Dans le contexte, je pense que c'était ambigu. La pinte d'un Char code> ne pas être un caractère (mais un petit entier) est celui qui devrait être adressé à Mordachai; C'est celui qui semble tenter de l'utiliser de cette façon - ou au moins une balustrade au fait que cela ne fonctionne pas.
@ DAN04: J'ai supprimé le paragraphe apparemment offensant. Le fait que tout le paragraphe était tout à fait semblable à un commentaire n'est pas une réponse.
Plus modéré afin de ne pas sembler susceptible d'augmenter à l'appât un peu argumentatif de Mordachai, et être plus constructif.
Le problème de l'extension de signe est facile à traiter. Vous pouvez soit utiliser:
Isspace ((non signé) CH) code> li>
-
ISSPACE (CH & 0XFF) CODE> LI>
- l'option compilateur qui fait
char code> un type non signé li>
ul> aussi loin du problème de caractère variable (je suppose que UTF-8), cela dépend de vos besoins. P>
Si vous venez de gérer les caractères de l'espacement d'ASCII \ t \ n \ v \ f \ r code>, puis Isspace code> fonctionnera bien; Les unités de code UTF-8 non-ASCII seront simplement traitées comme des non-espaces. P> mais si vous devez reconnaître les caractères d'espace supplémentaire Unicode \ x85 \ xa0 \ u1680 \ u180e \ u2000 \ u2001 \ u2002 \ u2003 \ u2004 \ u2005 \ u2004 \ u2007 \ u2008 \ u2028 \ u2029 \ u2028 \ u2029 \ u3000 \ u2029 \ u3000 code>, c'est un peu plus de travail. Vous pouvez écrire une fonction dans les lignes de p> xxx pré> où décod_char code> convertit une séquence UTF-8 sur le point de code Unicode correspondant et is_unicode_space code> renvoie true pour les caractères avec la catégorie z code> ou pour la cc code> caractères qui sont des espaces. iswspace code>
peut ou non aider avec le Ce dernier, en fonction de la qualité de votre bibliothèque C ++ prend en charge Unicode. Il est préférable d'utiliser une bibliothèque unicode dédiée pour le travail. P>
La plupart des chaînes en pratique utilisent un codage multi-mètres tel que UTF-7,
UTF-8, UTF-16, Shift-JIS, etc. P>
BlockQuote>
Aucun programmeur n'utiliserait UTF-7 ou Shift-JIS comme une représentation interne em> à moins qu'elles n'aiment pas la douleur. Stick avec Ŭtf-8, -16, ou -32, et seulement convertir au besoin. P> p>
J'apprécie les nombreuses réponses réfléchies. Cela m'a aidé à élargir mon réflexion sur les problèmes. Je voulais vous faire savoir que de nombreux programmes sont écrits à l'aide de la page de codes multibyte de la locale actuelle - qui à ma connaissance inclut Shift-JIS (ou quelque chose de très proche). Notre logiciel principal est en fait compilé pour MBCS, de sorte que le fonctionnement des longueurs de caractères variables est la norme pour nous. Comme si nous serions passés à UTF-16 (Windows natif), car c'est aussi un codage de largeur variable. C'est pourquoi il est difficile de justifier la douleur de la conversion de notre caractère étroit actuel en chargeur large ...
1. Pourquoi vous souciez-vous? 2. Fonctions de
ctype.h code> ne sont pas destinées à des caractères larges, ceux-ci sont dans
wctype.h code>. En ce qui concerne les caractères unicode de largeur variable, AFAIK La bibliothèque C Standard C n'a aucun support. Vous devrez peut-être utiliser une bibliothèque telle que l'ICU pour déterminer les traits de tels personnages. En outre, les caractères ne sont pas toujours de larges 8 bits. Il existe plusieurs plates-formes populaires avec des caractères 16 bits. Vous pouvez déterminer la taille de la Char en inspectant le symbole
CHAR_BIT CODE> PRÉPROCESSOR IN
LIMITS.H CODE>.
wchar_t est 16 bits (non signé je crois), mais toutes les saveurs de codages Unicode sont multi-octets - c'est-à-dire une longueur variable pour chaque caractère. Donc, plus d'affaires conviennent à 16 bits, beaucoup ne sont pas - certains ne correspondent même pas à 32 bits - donc peu importe quelle taille de caractère_type choisissez, il doit être faux parfois.
Pourquoi pourquoi soigner? Parce que cela apparaît en fait pour me mordre dans des logiciels internationaux. Je déboguise actuellement une question qui revient à signer l'expansion des caractères multi-largeurs de notre distributeur japonais. Tout le monde devrait s'en soucier, car il s'agit d'un échec fondamental de chaque bibliothèque à cordes que j'ai personnellement travaillé - et la plupart des développeurs ne réalisent même pas que les bibliothèques sont insuffisantes et que leur code abonde avec des problèmes en raison de la pensée inadéquate entourant ce problème. .
Vous continuez à parler d'absolus sur les choses qui ne sont pas spécifiées par la norme.
wchar_t code> n'est pas toujours i> b> 16 bits, c'est la mise en œuvre définie. La même chose est vraie pour sa signature. Ceci s'applique à
Char code> s aussi. Et si vous êtes sérieux à propos de l'internationalisation de votre logiciel, vous devez utiliser une bibliothèque d'unicode à gérer des chaînes, pas la norme C Bibliothèque C. Ce dernier est incapable de manipuler des choses comme des paires de substitution, par exemple, avec tout type de codage unicode.
Je suis sérieux à ce sujet - alors - quelle est cette "bibliothèque de conseil unicode" dont vous parlez? (En outre, il s'agit d'une exclusion totale que C / C ++ ne définit rien de cela, repoussant efficacement ce désordre sur les programmeurs américains - nous donnant presque des outils qui fonctionnent, mais pas tout à fait - au moins pas pour aucun codage unicode Je sais - ce qui est sûrement la norme DEFACTO que nous avons tous convenu dans 98% du monde informatique, non?)
Oui, les chaînes sont en désordre en C & C ++ (et probablement toutes les autres langages de programmation). ICU est une bibliothèque populaire d'AIGODE CAZDE; Je ne l'ai jamais utilisé moi-même, alors je peux garantir à quel point il est bon / mauvais.
@MOOINGDUCK Merci pour la douleur commune! ;) Donc, en théorie, je pourrais encoder à l'intérieur de chaque chaîne sous forme de caractères non signés de 38 bits et que je sois sûr que je pouvais les transmettre à une seule personne. Mais je pense que cela est inefficace, ainsi que toute la bibliothèque pour soutenir une telle chose (et je dois toujours faire des conversions sur toutes les E / S pour les API Windows, ainsi que davantage de fichiers généraux et d'E / S Le nouveau codage doit être converti. Je voudrais vraiment avoir une bibliothèque qui prend en charge entièrement Multibyte Unicode dans plusieurs codages: UTF-7, UTF-8, UTF-16 et Shift-JIS au minimum, ce qui évite lui-même ces problèmes.
@Praetorien, je suis curieux de ces plateformes populaires avec des caractères 16 bits. Pourriez-vous donner une référence?
@Mordachai: J'ai tapé le mauvais numéro, car le vrai est trop petit. Unicode est limité à 0x10ffff , vous n'avez donc besoin que de 20 bits.
Char code> ne peut pas être signé.
int code> est toujours. Et
Char code> ne peut pas être de 8 bits de large.
@RODRIGO TI DSPS a généralement des caractères de 16 bits. De plus, je pense que Blackfin DSPS d'appareils analogiques a des caractères 32 bits!
@MOOINGDUCK: C'est quelques-uns FFS Toomany - Unicode CodePoints figure dans la plage 0x0..0x10ffff, c'est-à-dire que vous avez besoin de 21 bits pour représenter toute la gamme; Vous avez raison que UTF-32 est un codage de caractères à largeur fixe - toutefois, dans la plupart des cas, vous êtes réellement intéressé par des grappes graphèmes (caractères perçus par l'utilisateur), et vous devrez traiter l'UTF-32 comme variable. longueur
@RODRIGO: J'ai vu plusieurs microchips avec des caractères 16 bits, mais je ne peux en trouver un maintenant. Le PDP-6 et le PDP-10 avaient des octets de 36 bits avec précision.
@ Tomalakgeret'kal: True, au niveau de la langue (ou au niveau de la compilation). Mais en termes d'impôt en laiton, pour la plate-forme que vous écrivez un logiciel, il existe un codage nécessaire (par exemple, juste pour utiliser la plupart de la bibliothèque STD: String, vous êtes obligé d'utiliser une certaine représentation - probablement une personne qui convient. au logiciel que vous écrivez). Pour nous, ou toute personne travaillant avec Windows Desktop Apps, nous avons besoin de codages que l'OS fonctionne facilement et lisez / écrit divers codages que les besoins du logiciel externes (divers). Donc, la langue peut prétendre à esquiver la question, mais échoue dans la pratique.
Voir Cette question pour une bonne discussion de ces problèmes.
Le langage C a été inventé à une époque où il était presque impossible de générer ou d'afficher un caractère sur 7 bits, il n'est donc pas surprenant que les fonctions héritées ne fonctionnent pas si bien dans le monde moderne. Unicode n'a pas été inventé avant plus de 15 ans plus tard. La réponse est d'utiliser une bibliothèque qui a été écrite avec ces problèmes.
Vous auriez fait beaucoup mieux pour avoir juste demandé à votre question non déraisonnable plutôt que de préambuler avec un préambule mal informé et argumenté, juste pour inviter des commentaires qui ne vous rapprochent pas vraiment d'une réponse.
@Clifford: Si tout ce que je voulais, c'était une réponse simple, alors oui. Mais je suis heureux que cela ait conduit à beaucoup plus qu'une réponse ponctuelle. Puis-je bénéficier d'être moins argumentatif? Je suis sûr. Peut-être que je serai ce jour mature;)
Ok les gens ... Il est temps de déplacer cela dans une salle de discussion. Les commentaires ne sont pas destinés à une discussion prolongée. Merci
@Mordachai: L'argument est plus puissant si c'est précis! L'un des critères de clôture d'une question à ce sujet est que " sollicitera probablement l'opinion, le débat, les arguments, le scrutin ou la discussion prolongée. I>" Cette question est-elle admissible quand elle n'a peut-être pas besoin.