Sto lavorando a un programma basato su terminale con supporto Unicode. Ci sono alcuni casi in cui ho bisogno di determinare quante colonne terminali consumerà una stringa prima di stamparla. Sfortunatamente alcuni caratteri sono larghi 2 colonne (cinese, ecc.), Ma ho trovato this answer che indica che un buon modo per rilevare caratteri a larghezza intera è chiamando u_getIntPropertyValue() dalla libreria ICU.Come rilevare la larghezza della stringa unicode nel terminale?
Ora sto cercando di analizzare i caratteri della mia stringa UTF8 e passarli a questa funzione. Il problema che sto avendo ora è che u_getIntPropertyValue() si aspetta un punto di codice UTF-32.
Qual è il modo migliore per ottenere questo da una stringa utf8? Attualmente sto provando a farlo con boost :: locale (usato altrove nel mio programma), ma ho problemi a ottenere una conversione pulita. Le mie stringhe UTF32 che provengono da boost :: locale sono pre-pese con uno zero-width character per indicare l'ordine dei byte. Ovviamente posso saltare solo i primi quattro byte della stringa, ma c'è un modo più pulito per farlo?
Ecco il mio attuale soluzione di brutto:
inline size_t utf8PrintableSize(const std::string &str, std::locale loc)
{
namespace ba = boost::locale::boundary;
ba::ssegment_index map(ba::character, str.begin(), str.end(), loc);
size_t widthCount = 0;
for (ba::ssegment_index::iterator it = map.begin(); it != map.end(); ++it)
{
++widthCount;
std::string utf32Char = boost::locale::conv::from_utf(it->str(), std::string("utf-32"));
UChar32 utf32Codepoint = 0;
memcpy(&utf32Codepoint, utf32Char.c_str()+4, sizeof(UChar32));
int width = u_getIntPropertyValue(utf32Codepoint, UCHAR_EAST_ASIAN_WIDTH);
if ((width == U_EA_FULLWIDTH) || (width == U_EA_WIDE))
{
++widthCount;
}
}
return widthCount;
}
Se si utilizza già in terapia intensiva, perché non usarlo per utf8-to-UTF-32 di conversione troppo? –
Non ho familiarità con l'ICU. Stavo cercando di usare boost :: locale per isolarmi dalla maggior parte della complessità. C'è un modo semplice per ottenere direttamente questo punto di codice utf32 dall'ICU? – KyleL
Non ho familiarità con questo, ma so che ha tutto ciò che chiunque ha mai voluto da una libreria Unicode. Passa un po 'di tempo con google e lo troverai. –