La localizzazione di stringhe di caratteri




La localizzazione di stringhe di caratteri in C ++

Il vasto numero di esempi di codice con C / C ++ stringhe (in tutte le fonti pubblicate) Si opera con le matrici zero terminali (ASCIZ) elementi char (nello stile di C), o stringa tipo di contenitore (nello stile di C ++), costruito come un add-on tali matrici. Tutto questo funziona a meraviglia con le stringhe latina (inglese) personaggi, ma può tornare a correre sulle linee, contenenti simboli di alfabeti di lingue straniere (russo, cinese, Arabo ed ebraico). Non c'è così semplice ... e molto poco descritti in letteratura, questo è comprensibile: autori di lingua inglese prestano poca attenzione alle questioni di localizzazione in lingua straniera, e gli autori nazionali, nella maggioranza, riscrivere e adattare le pubblicazioni in lingua inglese, non prestare attenzione a questo aspetto della questione.

linguaggio C - un vecchio linguaggio di programmazione, e C ++ eredita da esso formatta e vincolato dai requisiti di compatibilità sintattica con C. a, non avere un C / C ++ problema con tali linee (chiamato localizzato) è necessario capire che cosa sta succedendo con queste localizzazioni ...

storico, simboli (carbonizzare) presentata (1963 anno) ASCII standard come più giovane 7 bit di un byte, mentre alti 8 bit destinato per il controllo degli errori, verificato durante il trasferimento dei dati. Questa codifica consente di codificare tutti i possibili 128 diversi simboli, e questo numero è appena sufficiente per i caratteri dell'alfabeto inglese (grandi e piccoli), digitale (codice 0x30-0x39), manager (meno codice 0x20) e caratteri speciali. Quando si tratta di presentazione di alfabeti nazionali, digitare la tabella carattere alternativo, quali KOI-7 per la lingua russa. Il passaggio a una tabella di flusso di input-output per simbolo alternativo dal simbolo con codice 0x18 (codice viene chiamato: controllo dispositivo 2) nel flusso, e tornare al tavolo principale ASCII - il simbolo con il codice 0x17 (controllo dispositivo 1).

dopo, dal momento che metà degli anni '80, con il tempo PC IBM diffusa e sostituirli altre famiglie di computer, ASCII standard è stato esteso dal char byte di 8 bit, Byte potrebbe rappresentare 256 personaggi: junior 127 rappresenta la tabella ASCII originale (con alfabeto latino), e più anziani - alfabeto nazionale. ma, dal momento che gli alfabeti nazionali possono essere diverse, è quello di sostenere ciascuno di essi è stato richiesto di inserire una pagina di codice, per esempio, per la lingua russa, questa potrebbe essere la pagina di CP-866 (MS в), CP-1251 (в di Windows), No-8r (в UNIX, Linux) - e ciascuna di queste pagine sta offrendo la sua, caratterizzato da altri, l'ordine dei caratteri russi. così, per la visualizzazione corretta (o decodifica) qualsiasi stringa di caratteri localizzata è necessario conoscere la tabella codici in cui si è presentato.

a, per porre fine a questa babele di pagine di codice lingua, È stato proposto (1991città) standard Unicode rappresentazione, in cui il sistema di codifica, ogni carattere viene codificato valore a 32 bit (4 byte, ma non tutti i valori a 32 bit sono validi). Questo standard consente di codificare un numero enorme di personaggi di diversi sistemi di scrittura. documentazione, standard Unicode codificato, può comprendere un unico testo i caratteri giapponesi e cinesi, lettere latine, cirillico, alfabeto greco (un, e, io, Fr., p, l, F, Oh ...), simboli matematici, notazione musicale, simboli musicali, simboli estinti, raro, popoli esotici. Non v'è alcuna necessità di cambiare la pagina di codice. per esempio, Ecco i alcuni dei simboli del linguaggio, designato come “singaliskii”:

Il primo standard Unicode è stato rilasciato nel 91 anni esimo. Ultimo al momento - in 2017 e descrive 136755 diversi simboli.

Ma UNICODE - è ancora solo rappresentazione standard di ogni personaggio. Per rappresentare questo carattere in un particolare sistema operativo (o il linguaggio di programmazione) bisogno di più carattere sistema di codifica Unicode.

  • sistema di codifica è ampiamente usato:
    UTF-32 - usato per rappresentare ogni carattere 4 byte, codice UNICODE diretta valore numerico
  • UTF-32 - per rappresentare i simboli più comunemente usati usati 2 byte (prima 65536 posizioni), e il resto sono sotto forma di un "coppie surrogate". Questa codifica viene utilizzato su sistemi operativi Windows a partire da Windows NT.
  • UTF-32 - per rappresentare ogni carattere utilizza una sequenza di byte di lunghezza variabile: da 1 byte per i caratteri ASCII della tabella principale, a 6 byte per i caratteri usati raramente (caratteri alfabetici russi sono codificati con 2 byte). Questa codifica è stata creata tardi rispetto ad altri sistemi operativi per Plan 9 e Inferno nel 1992. Ken Thompson e Robert Pike con i colleghi, ed è entrato come un unico e alla rinfusa codifica di stringhe di caratteri in successivi linguaggi di programmazione Python e Go. Questa codifica è usata, Oggi in tutto il mondo, nei sistemi operativi POSIX / UNIX, Linux.

Tornando alla, che il C / C ++ vecchia famiglia di linguaggi di programmazione, per rappresentarli in caratteri localizzati necessario introdurre un nuovo tipo di dati - caratteri estesi wchar_t invece di char (il tipo di dati è apparso nello standard C89, ma, pienamente con supporto API, Solo nello standard C99). Invece di linea C delle funzioni di libreria forma str *() per un'ampia offerta loro controparti piena, ma come wc *() (invece del WCS scrittura prefix prefix str). Sistemi diversi possono avere diversi po wchar_t (in Linux è int32_t, int16_t в di Windows) ma per un programmatore che non importa e non crea differenze.

Per il lavoro e la conversione di sequenze multi-byte registrati in UTF-8 codifica in C / C ++ introdotta famiglia di funzioni mb *(): mbtowc(), mblen(), mbstowcs(), wcstombs() et al. Si tratta di un meccanismo per la conversione reciproca tra matrice char[] (che ha espresso anche stringhe UTF-8) wchar_t и[]. Se non si è di fronte a codifica UTF-8 (che probabilmente si verifica in Windows), allora questo gruppo di funzioni che non dovrebbe prendere.

Analogamente,, invece classe contenitore C ++ classe string introdotto un caratteri larghi simile contenitore wstring.

In particolare sulla tecnica di stringhe localizzate Ampi sarà discusso nel prossimo articolo. Nel frattempo, l'esempio elementare, 1 ° ... senza commento - come occasione di riflessione (nota e spiegare, che chiamando strlen() in ogni caso dà il numero di byte in una stringa non è coerente numero visivamente apparente di lettere in esso):

P.S. Con grande dettaglio circa la localizzazione in C / C ++ e le stringhe localizzate, che sono interessati in modo più dettagliato, si può leggere qui: localizzazione linguistica del C / C ++ localizzazione linguistica del C / C ++ - v'è una spiegazione più 22 pagine di formati di documenti per ufficio.

Newsletter nuove lezioni sulla programmazione:

La localizzazione di stringhe di caratteri
5 (100%) 1 votazione

Di olio

esperienze pratiche circa lo sviluppo del software 40 anni. Maestro globale Logic società di software internazionale. IBM Developer funziona autore permanente di pubblicazioni. redattore scientifico del computer casa editrice letteratura "Simbolo-Plus", San Pietroburgo.

Un pensiero su "La localizzazione di stringhe di caratteri

  1. Некоторые особенности работы с русскоязычными строками, которые не описываются обычно при рассмотрении строк char, будут рассмотрены в следующих статьях в продолжение этой темы.
    Следите

Lascia un Commento

L'indirizzo email non verrà pubblicato. i campi richiesti sono contrassegnati *