9
votes

Qui détermine la commande des caractères

J'ai une requête basée sur le programme ci-dessous -

char ch;
ch = 'z';
while(ch >= 'a')
{
    printf("char is  %c and the value is %d\n", ch, ch);
    ch = ch-1;
}


2 commentaires

Je ne sais pas. L'allemand a Ä, Ö, ü et ß comme des caractères minuscules. Ils manquent aussi. Pourquoi donc? Pourquoi pensez-vous que l'ordre de caractères ASCII est naturel ou quelque chose?


Parce que c'est ASCII, pas GSCII.


6 Réponses :


1
votes

Évidemment déterminé par la mise en œuvre de C que vous utilisez, mais plus susceptible de vous, il est probable que cela soit déterminé par le code standard américain d'échange d'informations ( ASCII ).


2 commentaires

Mais, alors comment ce programme peut-il causer des problèmes de portabilité?


Parce que la plate-forme peut utiliser EBCDIC au lieu d'ASCII. Ou parce que la langue utilise un alphabet différent.



17
votes

Le confidentiel du compilateur choisit son ensemble de caractères sous-jacents. À propos de la seule chose que la norme a à dire, c'est qu'un certain nombre de caractères minimal doit être disponible et que les caractères numériques sont contigus.

Les caractères requis pour un environnement d'exécution C99 sont A code> via z code>, a code> via z code>, 0 code> via 9 code> (qui doit être ensemble et dans ordre), n'importe lequel de ! "#% & '() * +, -. / :; ? [\] ^ _ {|} ~ code>, espace vertical, onglet horizontal, onglet vertical, Formule-alimentation, alerte, arrière-plan, retour de chariot et nouvelle ligne. Cela reste inchangé dans le courant actuel de C1X, la prochaine itération de cette norme. P>

Tout dépend de la mise en œuvre. P> Par exemple, code comme: p>

static char chrs[] = "zyxwvutsrqponmlkjihgfedcba";
char *pCh = chrs;
while (*pCh != 0) {
    printf ("char is %c and the value is %d\n", *pCh, *pCh);
    pCh++;
}


4 commentaires

Il convient de préciser que, bien que la norme C ne dicte pas l'ensemble de caractères ASCII, et à proprement parler, le code qui suppose que cela ne soit pas portable, que dans le monde réel où ebcdic et IBM Midrange / Mainsframes / Mainsframes (et seulement la merde IBM, IIRC) sont extrêmement et totalement non pertinents.


Pensée intéressante, @Warren, rappelez-vous que la prochaine fois que vous utilisez une banque.


Quelle banque traite des transactions avec C code C sur IBM Midrange ou Mainfrailles, Paxdiablo?


Ensuite, j'ai mal compris votre commentaire, Warren, je pensais que vous indiquiez que les personnages de main-d'œuvre étaient non pertinents. En tout état de cause, aucun d'entre nous ne sait que les banques utilisent ou non que c sur leur grand fer à repasser (je doute que cela, CICS et DB2 sont beaucoup plus probables au moins pour les trucs de TP et de la clientèle). Malgré cela, je sais pour un fait qu'il y a est beaucoup de code C écrit pour les ordinateurs centraux et les AS400. Si vous souhaitez limiter l'endroit où votre logiciel peut être utilisé, c'est votre droit et vous ne serez peut-être heureux que de pouvoir cibler 99,5% de l'industrie :-)



1
votes

Il est déterminé par tout ce que l'ensemble de caractères d'exécution est.

Dans la plupart des cas de nos jours, c'est-à-dire le jeu de caractères ASCII, mais C n'a aucune exigence qu'un ensemble de caractères spécifique soit utilisé.

Notez qu'il y a certains garantit la commande de caractères dans le jeu de caractères d'exécution. Par exemple, les chiffres '0' à travers '9' sont garantis chacun d'une valeur supérieure à la valeur du chiffre précédent.


0 commentaires

4
votes

Pourquoi l'impression de l'ensemble de l'ensemble de lettres minuscules non garanties dans le programme ci-dessus.

car il est possible d'utiliser c avec un codage du personnage EBCDIC dans lequel les lettres sont aren 't consécutif.


3 commentaires

D'accord. THX pour la clarification +1. Ainsi, cette utilisation de l'EBCDIC sur certains systèmes et ASCII sur certains systèmes peut causer des problèmes de portabilité. Mais, qui décide de la sélection de EBCDIC ou ASCII et quand est-ce que cela fait?


Il est décidé par le système d'exploitation. EBCDIC est utilisé uniquement par IBM Mainframes; Tout le monde utilise des variantes d'ASCII. J'ai dit "variantes d'ASCII, car l'ASCII n'encoue que 128 caractères pour l'anglais américain et d'autres langues nécessitent des codages qui ont des lettres accentuées ou un script non latin. Il y a eu littéralement des centaines de codages de caractères spécifiques à la région et à la plate-forme développés, mais une tendance récente a été une tendance récente à l'utilisation de l'UTF-8.


@ Dan04, l'AS400 utilise également EBCDIC et, contrairement à ce que les fanboys AS400 vous le diront, c'est pas un mainframe :-)



1
votes

Ces jours-ci, les gens qui vont faire appel à votre code non portable sont engagés dans un pédantisme inutile. La prise en charge des codages incompatibles ASCII ne reste que dans la norme C en raison de l'héritage des centrales EBCDIC qui refusent de mourir. Vous ne rencontrerez jamais un encodage de charme ASCII-incompatible sur un ordinateur moderne, maintenant ou à l'avenir. Donnez-lui quelques décennies et vous ne rencontrerez jamais rien que UTF-8.

Pour répondre à votre question sur Qui décide décide du codage du personnage: Bien qu'elle soit nominale à l'évacuation de votre mise en œuvre (le compilateur C, la bibliothèque et le système d'exploitation), il a été finalement décidé par Internet, à la fois existant. Practice et normes IETF. Les systèmes probablement modernes sont destinés à communiquer et à interagir les uns avec les autres, et il s'agirait d'énormes maux de tête de convertir chaque en-tête de protocole, du fichier HTML, de la source JavaScript, du nom d'utilisateur, etc. d'aller et d'autre entre les codages compatibles ASCII et EBCDIC ou certains Autre mess local.

Ces derniers temps, il est devenu évident qu'un codage universel non seulement pour le texte analysé par la machine, mais aussi pour le texte en langage naturel est également très souhaitable. (L'échange de texte de langage naturel n'est pas aussi fondamental que le texte analysé par la machine, mais toujours très courant et important.) Unicode a fourni le jeu de caractères et, comme le seul codage unicode compatible ASCII, UTF-8 est à peu près le successeur de l'ASCII. le caractère universel codant.


8 commentaires

Je suis désolé, r, mais cette déclaration sur "Ne jamais rencontrer un encodage de charme ASCII-incompatible sur tout ordinateur moderne" est une ordure complète. Pensez-vous vraiment que le mainframe d'aujourd'hui est inchangé du système / 360? Unix System Services Sous Z / OS utilise EBCDIC et, si vous consultez les dernières machines Z10 CE, ils vont faire sauter autre chose de l'eau en termes de débit brut (pas seulement de la CPU). Le reste que je suis d'accord avec.


J'aurais dû faire plus attention à définir ce que je voulais dire par moderne. Bien que ce soit un matériel moderne, le logiciel qu'il est en cours d'exécution est bloqué à mi-chemin dans les âges sombres.


@R: Définissez "Agiaires sombres" en chronologie informatique. Dites-nous comment vous savez que le logiciel qui fonctionne sur les ordinateurs centraux modernes est de l'âges sombre.


Ma réponse et mes commentaires n'étaient pas destinés à provoquer des arguments, mais il semble qu'ils ont, pour une raison quelconque. Je vais juste le laisser à cela depuis que le point était de répondre à la question et de ne pas se livrer à des débats sur ce que signifie "moderne".


Z / OS peut être un système fin autrement, mais EBCDIC est définitivement provenant des âges sombres. Après tout, c'était conçu pour la compatibilité avec un codage de la carte perforée et des cartes perforées sont sorties de style avant que je sois née!


z / OS et OS / 400 sont des dinosaures [semi-] dinosaures.


Warren, parlé comme un véritable développeur de PC :-)


Non, un développeur de PC dirait «c'est comme ça que c'est sur ma machine, il faut donc être comme ça partout». Un développeur qui pense aux normes et à l'interopérabilité (normes mondiales réelles, au-delà du minimum de base requis), dirait: «C'est comme ça que c'est sur Internet et sur la grande majorité des systèmes POSIX, c'est ainsi que cela devrait être partout. " :-)



0
votes

Je vous réponds trop tard mais en dehors de ce qui a déjà été dit que je veux ajouter un peu.

à la 5ème phase de traduction (partie du préprocesseur) Chaque membre de l'ensemble de caractères source est converti en caractère correspondant du jeu de caractères d'exécution. Devis de ISO 9899 , 5.1.1.2p5

  1. chaque élément de jeu de caractères source et séquence d'échappement dans les constantes de caractères et Les littéraux de chaîne sont convertis en un élément correspondant du caractère d'exécution ensemble; S'il n'y a pas d'élément correspondant, il est converti en un élément de mise en œuvre-défini autre que le caractère NULL (large). 7)

    Il n'est pas nécessaire que la source de caractères soit identique à celle de l'ensemble de caractères de l'exécution; Comme d'autres d'autres disent, si l'exécution de caractère est EBCDIC Of IBM's's Mainframe , la logique n'est pas la comme dans le cas de l'ensemble de caractères ASCII.


0 commentaires