El carácter sin firmar se ha utilizado normalmente para contener cadenas de estilo Unicode, ¿está seguro de que desea convertirlo directamente en lugar de convertir el contenido?
@ jesses.co.tt Gracias por el voto negativo. La característica clave de esta publicación que hace que sea votada a favor es su puntualidad. Las otras respuestas brindan varios detalles y es mejor leerlas y votarlas por separado. Si la respuesta de @JaredPars cubre lo que está buscando, lo usaría y / o lo votaría. Notarás que también he invertido tiempo en mejorar el formato de esos. Realmente no veo el sentido de expandir esta respuesta para abarcar el contenido de las demás.
Ruben Bartelink
3
ok, entiendo que su razón de ser aquí, y tomado como una página completa, estoy de acuerdo en que no hubo necesidad de volver a articular ... Supongo que es difícil tomarse el tiempo y mirar la página completa y las marcas de tiempo en lugar de juzgando cada respuesta por sus propios méritos ... pero se toma el punto (¡especialmente de alguien que tiene
55 veces
1
@ jesses.co.tt No se preocupe, entiendo su perspectiva y no está muy equivocado. Para ser honesto, ha pasado mucho tiempo desde que "compití" en etiquetas de alto tráfico con respuestas más rápidas como esta. Pero no obtienes este nivel de reputación eliminando tu respuesta, incluso si eso es lo correcto (¡que otro día estaría discutiendo con la misma alegría!). Bien, tenemos una pared de texto abarrotando el lugar, por lo que su misión está cumplida: P
Ruben Bartelink
23
Me gustó especialmente cómo te preocupaba tanto gritar "¡PRIMERO!" que ni siquiera te molestaste basic formatting.
OJFord
8
Esta es una "respuesta" verdaderamente inútil. Simplemente no proporciona información.
OYRM
60
char *y const unsigned char *se consideran tipos no relacionados. Entonces quieres usar reinterpret_cast.
Pero si va a pasar de const unsigned char*un consttipo que no es, debe usar const_castprimero. reinterpret_castno puede desechar una calificación consto volatile.
"No relacionado" es engañoso aquí: da una impresión que no se puede transmitir de uno a otro. Estoy leyendo un borrador de 2014, "3.9.1 Tipos fundamentales", y dice: "A char, a signed chary an unsigned charocupan la misma cantidad de almacenamiento y tienen el mismo requisito de alineación". Esta ES una relación. O aquí hay un enlace más legible: en.cppreference.com/w/cpp/language/types#Character_types
unsigned char * es básicamente una matriz de bytes y debe usarse para representar datos brutos en lugar de una cadena en general. Una cadena Unicode se representaría como wchar_t *
De acuerdo con el estándar C ++, un reinterpret_cast entre unsigned char * y char * es seguro ya que son del mismo tamaño y tienen la misma construcción y restricciones. Intento evitar reintrepret_cast incluso más que const_cast en general.
Si la transmisión estática falla con lo que está haciendo, es posible que desee reconsiderar su diseño porque, francamente, si está usando C ++, es posible que desee aprovechar lo que ofrece la parte "plus plus" y usar clases de cadena y STL (también conocido como std :: basic_string podría funcionar mejor para ti)
Demasiados comentarios para hacer a diferentes respuestas, así que dejaré otra respuesta aquí.
Puedes y debes usar reinterpret_cast<>, en tu caso
str.append(reinterpret_cast<constchar*>(foo()));
porque, si bien estos dos son tipos diferentes, el capítulo de la norma de 2014 3.9.1 Fundamental types [basic.fundamental]dice que existe una relación entre ellos:
Llano char, signed chary unsigned chartres tipos distintos, denominados colectivamente tipos de caracteres estrechos. A char, signed charay a unsigned charocupan la misma cantidad de almacenamiento y tienen los mismos requisitos de alineación (3.11); es decir, tienen la misma representación de objeto.
Respuestas:
reinterpret_cast
fuente
basic formatting
.char *
yconst unsigned char *
se consideran tipos no relacionados. Entonces quieres usarreinterpret_cast
.Pero si va a pasar de
const unsigned char*
unconst
tipo que no es, debe usarconst_cast
primero.reinterpret_cast
no puede desechar una calificaciónconst
ovolatile
.fuente
char
, asigned char
y anunsigned char
ocupan la misma cantidad de almacenamiento y tienen el mismo requisito de alineación". Esta ES una relación. O aquí hay un enlace más legible: en.cppreference.com/w/cpp/language/types#Character_typesTratar
reinterpret_cast
unsigned char *foo(); std::string str; str.append(reinterpret_cast<const char*>(foo()));
fuente
unsigned char * es básicamente una matriz de bytes y debe usarse para representar datos brutos en lugar de una cadena en general. Una cadena Unicode se representaría como wchar_t *
De acuerdo con el estándar C ++, un reinterpret_cast entre unsigned char * y char * es seguro ya que son del mismo tamaño y tienen la misma construcción y restricciones. Intento evitar reintrepret_cast incluso más que const_cast en general.
Si la transmisión estática falla con lo que está haciendo, es posible que desee reconsiderar su diseño porque, francamente, si está usando C ++, es posible que desee aprovechar lo que ofrece la parte "plus plus" y usar clases de cadena y STL (también conocido como std :: basic_string podría funcionar mejor para ti)
fuente
Debería usar un
reinterpret_cast<>
ya que los dos tipos entre los que está lanzando no están relacionados entre sí.fuente
Demasiados comentarios para hacer a diferentes respuestas, así que dejaré otra respuesta aquí.
Puedes y debes usar
reinterpret_cast<>
, en tu casostr.append(reinterpret_cast<const char*>(foo()));
porque, si bien estos dos son tipos diferentes, el capítulo de la norma de 2014
3.9.1 Fundamental types [basic.fundamental]
dice que existe una relación entre ellos:(la selección es mía)
Aquí hay un enlace disponible: https://en.cppreference.com/w/cpp/language/types#Character_types
El uso
wchar_t
de cadenas Unicode / multibyte está desactualizado: ¿Debería usar wchar_t cuando uso UTF-8?fuente
const unsigned attribName = getname(); const unsigned attribVal = getvalue(); const char *attrName=NULL, *attrVal=NULL; attrName = (const char*) attribName; attrVal = (const char*) attribVal;
fuente