2013-12-18 14 views
7

Come verificare se un carattere Unicode è a larghezza intera?C++ controlla se il carattere unicode è a larghezza intera

Io uso Win32/MFC

Per esempio, è di grande ampiezza, A non è di grande ampiezza, è di grande ampiezza, F non è di grande ampiezza.

+0

ti rendi conto che la domanda non ha senso. Una stringa non significa nulla se non sai nulla della sua codifica. Per favore, dai un'occhiata a questo simpatico artetto che dovrebbe far luce sull'argomento -> http://www.joelonsoftware.com/articles/Unicode.html – Pandrei

+1

+1 La tua domanda mi ha fatto andare e imparare qualcosa oggi! – Roddy

+0

@Pandrei non consiglierei quell'articolo. Mentre fa uno o due punti utili, ci sono anche un paio di errori: per i principianti, l'autore non sembra capire la differenza _UCS_ e _UTF_. –

risposta

-2

Cosa intendi per "larghezza piena"? La larghezza di un carattere dipende dal tipo di carattere che viene visualizzato in.

Se vuoi dire se si tratta di un singolo carattere di byte o no, è ancora non è chiaro. Un singolo carattere in quale codifica? In UTF-8, sarà un carattere a byte singolo se (e solo se) il punto di codice è inferiore a 128; se usi UTF-16 (probabile, dato che sei sotto Windows), confronta il carattere con 128. Una codifica a singolo byte in ISO 8859-1 (un'altra codifica a diffusione estesa ): confronta con 256. Per qualsiasi valore inferiore a 256, l'unità UTF-16 sarà numericamente identica al punto di codice in ISO 8859-1 (talvolta noto come Latin-1). Per il byte singolo codifica ASCII (quasi mai usato oggi, ma la maggior parte delle codifiche comuni sono identiche a esso per il primo 128 codice punti), qualsiasi valore inferiore a 128 è buono.

+1

http://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms – Roddy

+0

@Roddy Questo ha più senso. Avrei dovuto cercare il suo secondo carattere a larghezza intera nella mia codifica Unicode. (Ovviamente, in pratica significa che non esiste una risposta semplice.) –

8

Quello che ti serve è recuperare il East Asian Width del personaggio. È possibile farlo analizzando il file EastAsianWidth.txt dal database dei caratteri Unicode. Non sono riuscito a trovare un'API Win32 che restituisca queste informazioni, ma in Python, ad esempio, è possibile utilizzare unicodedata.east_asian_width(unichr).

Vedere lo Annex #11 per lo sfondo del problema e ulteriori informazioni.

+0

Questa è la risposta corretta. FWIW: i vari file del consorzio Unicode sono stati progettati per semplificare l'analisi, quindi non dovrebbe essere troppo difficile generare una tabella C++ da essa. (Ho fatto questo per un certo numero di altri file di questo tipo.) –

+0

Ci sono altre lingue oltre all'Est asiatico con caratteri a larghezza intera? – linquize

+0

Per una discussione più completa, vedere questa risposta: http://stackoverflow.com/a/9145712/53974 – Blaisorblade

Problemi correlati