2011-09-28 42 views
5

sé que para obtener un carácter Unicode en C++ que puedo hacer:¿Cómo iterar sobre caracteres Unicode en C++?

std::wstring str = L"\u4FF0"; 

Sin embargo, lo que si quiero conseguir todos los caracteres del rango 4FF0 a 5FF0? ¿Es posible construir dinámicamente un carácter Unicode? Lo que tengo en mente es algo como esto pseudo-código:

for (int i = 20464; i < 24560; i++ { // From 4FF0 to 5FF0 
    std::wstring str = L"\u" + hexa(i); // build the unicode character 
    // do something with str 
} 

¿Cómo puedo hacer que en C++?

Respuesta

9

El tipo wchar_t celebrada dentro de un wstring es un tipo entero, por lo que puede utilizar directamente:

for (wchar_t c = 0x4ff0; c <= 0x5ff0; ++c) { 
    std::wstring str(1, c); 
    // do something with str 
} 

Tenga cuidado tratando de hacer esto con caracteres anteriores 0xffff, ya que dependiendo de la plataforma (por ejemplo, Windows) no encajarán en un wchar_t.

Si, por ejemplo, que quería ver la Emoticon block en una cadena, puede crear pares suplentes:

std::wstring str; 
for (int c = 0x1f600; c <= 0x1f64f; ++c) { 
    if (c <= 0xffff || sizeof(wchar_t) > 2) 
     str.append(1, (wchar_t)c); 
    else { 
     str.append(1, (wchar_t)(0xd800 | ((c - 0x10000) >> 10))); 
     str.append(1, (wchar_t)(0xdc00 | ((c - 0x10000) & 0x3ff))); 
    } 
} 
+0

¿Existe una solución fácil para los puntos de código> 0xffff? –

+1

@Captain Giraffe, si su tipo de wchar_t es más grande que 16 bits, no habrá problema. De lo contrario, debe dividirlo en dos caracteres wchar_t de acuerdo con las reglas [UTF-16] (http://en.wikipedia.org/wiki/Utf-16). –

+1

Si hoy fuera ayer, el tipo se habría llamado byte, no char =) También "word" viene a la mente –

2

¿Qué hay de:

for (std::wstring::value_type i(0x4ff0); i <= 0x5ff0; ++i) 
{ 
    std::wstring str(1, i); 
} 

Tenga en cuenta que el código no ha sido probado, por lo que no puede compilar como está.

Además, dado que la plataforma que está trabajando en una unidad de caracteres wstring puede tener 2, 4 o N bytes de ancho, así que tenga la intención de usarla.

+0

reemplace 'char_type' con' value_type' y se compilará. – Cubbi

+0

@Cubbi: Hecho, gracias. – fbrereto

4

No puedes incremento sobre los caracteres Unicode como si se trata de una matriz, algunos personajes son la acumulación de múltiples 'char's' (UTF-8) y múltiples 'WCHAR's (UTF-16) que se deben a los signos diacríticos, etc. Si es realmente serio acerca de esto, debería usar una API como UniScribe o ICU.

Algunos recursos para que diga:

http://en.wikipedia.org/wiki/UTF-16/UCS-2

http://en.wikipedia.org/wiki/Precomposed_character

http://en.wikipedia.org/wiki/Combining_character

http://scripts.sil.org/cms/scripts/page.php?item_id=UnicodeNames#4d2aa980

http://en.wikipedia.org/wiki/Unicode_equivalence

http://msdn.microsoft.com/en-us/library/dd374126.aspx

+1

La primera afirmación es correcta; las razones no. UTF-8 y UTF-16 son codificaciones, y son ortogonales a los puntos de código. Los diacríticos también son puntos de código, por lo que son independientes de UTF-8 y -16 también – MSalters