Compartir vía


Clase codecvt

Plantilla de clase que describe un objeto que puede actuar como faceta de configuración regional. Puede controlar las conversiones entre una secuencia de valores usados para codificar caracteres dentro del programa y una secuencia de valores usados para codificar caracteres fuera del programa.

Sintaxis

template <class CharType, class Byte, class StateType>
class codecvt : public locale::facet, codecvt_base;

Parámetros

CharType
Tipo usado dentro de un programa para codificar caracteres.

Byte
Tipo usado para codificar caracteres fuera de un programa.

StateType
Tipo que se puede usar para representar los estados intermedios de una conversión entre los tipos internos y externos de representaciones de caracteres.

Comentarios

La plantilla de clase describe un objeto que puede actuar como faceta de configuración regional para controlar las conversiones entre una secuencia de valores de tipo CharType y una secuencia de valores de tipo Byte. La clase StateType caracteriza la transformación y un objeto de clase StateType almacena la información de estado necesaria durante una conversión.

La codificación interna emplea una representación con un número fijo de bytes por carácter, normalmente de tipo char o de tipo wchar_t.

Como ocurre con cualquier faceta de configuración regional, el id de objeto estático tiene un valor almacenado inicial de cero. El primer intento de acceso a su valor almacenado almacena un valor positivo único en id.

Las versiones de plantilla de do_in y do_out siempre devuelven codecvt_base::noconv.

La biblioteca estándar de C++ define varias especializaciones explícitas:

template<>
codecvt<wchar_t, char, mbstate_t>

convierte entre secuencias wchar_t y char.

template<>
codecvt<char16_t, char, mbstate_t>

convierte entre secuencias char16_t codificadas como UTF-16 y secuencias char codificadas como UTF-8.

template<>
codecvt<char32_t, char, mbstate_t>

convierte entre secuencias char32_t codificadas como UTF-32 (UCS-4) y secuencias char codificadas como UTF-8.

Constructores

Constructor Descripción
codecvt Constructor de objetos de clase codecvt que actúa como faceta de configuración regional para controlar las conversiones.

Typedefs

Nombre de tipo Descripción
extern_type Tipo de carácter que se usa para las representaciones externas.
intern_type Tipo de carácter que se usa para las representaciones internas.
state_type Tipo de carácter que se usa para representar los estados intermedios durante las conversiones entre las representaciones internas y externas.

Funciones miembro

Función de miembro Descripción
always_noconv Comprueba si no es necesario realizar ninguna conversión.
do_always_noconv Función virtual a la que se llama para comprobar si no es necesario realizar ninguna conversión.
do_encoding Función virtual que comprueba si la codificación del flujo Byte depende del estado, si la relación entre los valores Byte usados y los valores CharType generados es constante y, en tal caso, determina el valor de esa relación.
do_in Función virtual a la que se llama para convertir una secuencia de valores Byte internos en una secuencia de valores CharType externos.
do_length Función virtual que determina cuántos valores Byte de una secuencia determinada de valores Byte externos generan no más de un número determinado de valores CharType internos y devuelve ese número de valores Byte.
do_max_length Función virtual que devuelve el número máximo de bytes externos necesarios para generar un CharType interno.
do_out Función virtual a la que se llama para convertir una secuencia de valores CharType internos en una secuencia de bytes externos.
do_unshift Función virtual a la que se llama para proporcionar los valores Byte necesarios en una conversión dependiente del estado para completar el último carácter de una secuencia de valores Byte.
encoding Comprueba si la codificación del flujo Byte depende del estado, si la relación entre los valores Byte usados y los valores CharType generados es constante y, en tal caso, determina el valor de esa relación.
in Convierte una representación externa de una secuencia de valores Byte en una representación interna de una secuencia de valores CharType.
length Determina cuántos valores Byte de una secuencia determinada de valores Byte externos generan no más de un número determinado de valores CharType internos y devuelve ese número de valores Byte.
max_length Devuelve el número máximo de valores Byte externos necesarios para generar un CharType interno.
out Convierte una secuencia de valores CharType internos en una secuencia de valores Byte externos.
unshift Proporciona los valores Byte externos necesarios en una conversión dependiente del estado para completar el último carácter de la secuencia de valores Byte.

Requisitos

Encabezado: <locale>

Espacio de nombres: std

codecvt::always_noconv

Comprueba si no es necesario realizar ninguna conversión.

bool always_noconv() const throw();

Valor devuelto

Un valor booleano que es true si es no necesario realizar ninguna conversión; false si se debe realizar al menos una.

Comentarios

La función miembro devuelve do_always_noconv.

Ejemplo

// codecvt_always_noconv.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
using namespace std;

int main( )
{
   locale loc ( "German_Germany" );
   bool result1 = use_facet<codecvt<char, char, mbstate_t>>
      ( loc ).always_noconv( );

   if ( result1 )
      cout << "No conversion is needed." << '\n';
   else
      cout << "At least one conversion is required." << '\n';

   bool result2 = use_facet<codecvt<wchar_t, char, mbstate_t>>
      ( loc ).always_noconv( );

   if ( result2 )
      cout << "No conversion is needed." << '\n';
   else
      cout << "At least one conversion is required." << '\n';
}
No conversion is needed.
At least one conversion is required.

codecvt::codecvt

Constructor de objetos de clase codecvt que actúa como faceta de configuración regional para controlar las conversiones.

explicit codecvt(size_t refs = 0);

Parámetros

refs
Valor entero que se usa para especificar el tipo de administración de memoria del objeto.

Comentarios

Los valores posibles del parámetro refs y su importancia son:

  • 0: la vigencia del objeto se administra mediante las configuraciones regionales que lo contienen.

  • 1: la vigencia del objeto se debe administrar de manera manual.

  • 2: estos valores no están definidos.

El constructor inicializa su objeto base locale::facet con locale::facet(refs).

codecvt::do_always_noconv

Función virtual a la que se llama para comprobar si no es necesario realizar ninguna conversión.

virtual bool do_always_noconv() const throw();

Valor devuelto

La función miembro virtual protegida devuelve true solo si todas las llamadas a do_in o do_out devuelven noconv.

La versión de plantilla devuelve siempre true.

Ejemplo

Vea el ejemplo de always_noconv, que llama a do_always_noconv.

codecvt::do_encoding

Función virtual que comprueba si la codificación del flujo Byte depende del estado, si la relación entre los valores Byte usados y los valores CharType generados es constante y, en tal caso, determina el valor de esa relación.

virtual int do_encoding() const throw();

Valor devuelto

La función miembro virtual protegida devuelve:

  • -1, si la codificación de secuencias de tipo extern_type depende del estado.

  • 0, si la codificación implica secuencias de longitud variable.

  • N, si la codificación implica solo secuencias de longitud N.

Ejemplo

Vea el ejemplo de encoding, que llama a do_encoding.

codecvt::d o_in

Función virtual a la que se llama para convertir una secuencia de valores Byte externos en una secuencia de valores CharType internos.

virtual result do_in(
    StateType& state,
    const Byte* first1,
    const Byte* last1,
    const Byte*& next1,
    CharType* first2,
    CharType* last2,
    CharType*& next2,) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first1
Puntero al principio de la secuencia que se va a convertir.

last1
Puntero al final de la secuencia que se va a convertir.

next1
Puntero más allá del final de la secuencia convertida, al primer carácter sin convertir.

first2
Puntero al principio de la secuencia convertida.

last2
Puntero al final de la secuencia convertida.

next2
Puntero al CharType que viene después del último CharType convertido, hasta el primer carácter sin modificaciones en la secuencia de destino.

Valor devuelto

Un valor devuelto que indica si la operación se ha realizado correctamente, parcialmente o no se ha realizado correctamente. La función devuelve:

  • codecvt_base::error si la secuencia de origen tiene un formato incorrecto.

  • codecvt_base::noconv si la función no realiza ninguna conversión.

  • codecvt_base::ok si la conversión se realiza correctamente.

  • codecvt_base::partial si el origen no es suficiente o si el destino no es lo suficientemente grande para que la conversión se realice correctamente.

Comentarios

state debe representar el estado de conversión inicial al principio de una nueva secuencia de origen. La función modifica su valor almacenado según sea necesario para reflejar el estado actual de una conversión correcta. De lo contrario, su valor almacenado no se especifica.

Ejemplo

Vea el ejemplo de in, que llama a do_in.

codecvt::do_length

Función virtual que determina cuántos valores Byte de una secuencia determinada de valores Byte externos generan no más de un número determinado de valores CharType internos y devuelve ese número de valores Byte.

virtual int do_length(
    const StateType& state,
    const Byte* first1,
    const Byte* last1,
    size_t len2) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first1
Puntero al principio de la secuencia externa.

last1
Puntero al final de la secuencia externa.

len2
El número máximo de valores Byte que puede devolver la función miembro.

Valor devuelto

Un entero que representa el número máximo de conversiones, no mayor que len2, definido por la secuencia de origen externo en [first1, last1).

Comentarios

La función miembro virtual protegida llama a do_in( state, first1, last1, next1, buf, buf + len2, next2) para state (una copia del estado), algún búfer buf y punteros next1 y next2.

Después, devuelve next2 - buf. Cuenta el número máximo de conversiones, no mayor que len2, definido por la secuencia de origen en [first1, last1).

La versión de plantilla devuelve siempre el menor de last1 - first1 y len2.

Ejemplo

Vea el ejemplo de length, que llama a do_length.

codecvt::do_max_length

Función virtual que devuelve el número máximo de valores Byte externos necesarios para generar un CharType interno.

virtual int do_max_length() const throw();

Valor devuelto

El número máximo de valores Byte necesarios para generar un CharType.

Comentarios

La función miembro virtual protegida devuelve el mayor valor posible que puede devolver do_length( first1, last1, 1) para los valores válidos arbitrarios de first1 y last1.

Ejemplo

Vea el ejemplo de max_length, que llama a do_max_length.

codecvt::do_out

Función virtual a la que se llama para convertir una secuencia de valores CharType internos en una secuencia de valores Byte externos.

virtual result do_out(
    StateType& state,
    const CharType* first1,
    const CharType* last1,
    const CharType*& next1,
    Byte* first2,
    Byte* last2,
    Byte*& next2) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first1
Puntero al principio de la secuencia que se va a convertir.

last1
Puntero al final de la secuencia que se va a convertir.

next1
Referencia a un puntero al primer CharType sin convertir, después del último CharType convertido.

first2
Puntero al principio de la secuencia convertida.

last2
Puntero al final de la secuencia convertida.

next2
Referencia a un puntero al primer Byte sin convertir, después del último Byte convertido.

Valor devuelto

La función devuelve:

  • codecvt_base::error si la secuencia de origen tiene un formato incorrecto.

  • codecvt_base::noconv si la función no realiza ninguna conversión.

  • codecvt_base::ok si la conversión se realiza correctamente.

  • codecvt_base::partial si el origen no es suficiente o si el destino no es lo suficientemente grande para que la conversión se realice correctamente.

Comentarios

state debe representar el estado de conversión inicial al principio de una nueva secuencia de origen. La función modifica su valor almacenado según sea necesario para reflejar el estado actual de una conversión correcta. De lo contrario, su valor almacenado no se especifica.

Ejemplo

Vea el ejemplo de out, que llama a do_out.

codecvt::do_unshift

Función virtual a la que se llama para proporcionar los valores Byte necesarios en una conversión dependiente del estado para completar el último carácter de una secuencia de valores Byte.

virtual result do_unshift(
    StateType& state,
    Byte* first2,
    Byte* last2,
    Byte*& next2) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first2
Puntero a la primera posición del intervalo de destino.

last2
Puntero a la última posición del intervalo de destino.

next2
Puntero al primer elemento sin modificaciones en la secuencia de destino.

Valor devuelto

La función devuelve:

  • codecvt_base::error si state representa un estado no válido.

  • codecvt_base::noconv si la función no realiza ninguna conversión

  • codecvt_base::ok si la conversión se realiza correctamente.

  • codecvt_base::partial si el destino no es lo bastante grande para que la conversión se realice correctamente.

Comentarios

La función miembro virtual protegida intenta convertir el elemento de origen CharType(0) en una secuencia de destino que almacena en [first2, last2), excepto el elemento que finaliza Byte(0). Siempre almacena en next2 un puntero al primer elemento sin modificaciones en la secuencia de destino.

State debe representar el estado de conversión inicial al principio de una nueva secuencia de origen. La función modifica su valor almacenado según sea necesario para reflejar el estado actual de una conversión correcta. Normalmente, al convertir el elemento de origen CharType(0), el estado actual queda en el estado de conversión inicial.

Ejemplo

Vea el ejemplo de unshift, que llama a do_unshift.

codecvt::encoding

Comprueba si la codificación del flujo Byte depende del estado, si la relación entre los valores Byte usados y los valores CharType generados es constante y, en tal caso, determina el valor de esa relación.

int encoding() const throw();

Valor devuelto

Si el valor devuelto es positivo, ese valor es el número constante de caracteres Byte necesarios para producir el carácter CharType.

La función miembro virtual protegida devuelve:

  • -1, si la codificación de secuencias de tipo extern_type depende del estado.

  • 0, si la codificación implica secuencias de longitud variable.

  • N, si la codificación implica solo secuencias de longitud N.

Comentarios

La función miembro devuelve do_encoding.

Ejemplo

// codecvt_encoding.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
using namespace std;

int main( )
{
   locale loc ( "German_Germany" );
   int result1 = use_facet<codecvt<char, char, mbstate_t>> ( loc ).encoding ( );
   cout << result1 << '\n';
   result1 = use_facet<codecvt<wchar_t, char, mbstate_t>> ( loc ).encoding( );
   cout << result1 << '\n';
   result1 = use_facet<codecvt<char, wchar_t, mbstate_t>> ( loc ).encoding( );
   cout << result1 << '\n';
}
1
1
1

codecvt::extern_type

Tipo de carácter que se usa para las representaciones externas.

typedef Byte extern_type;

Comentarios

El tipo es un sinónimo del parámetro de plantilla Byte.

codecvt::in

Convierte una representación externa de una secuencia de valores Byte en una representación interna de una secuencia de valores CharType.

result in(
    StateType& state,
    const Byte* first1,
    const Byte* last1,
    const Byte*& next1,
    CharType* first2,
    CharType* last2,
    CharType*& next2,) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first1
Puntero al principio de la secuencia que se va a convertir.

last1
Puntero al final de la secuencia que se va a convertir.

next1
Puntero más allá del final de la secuencia convertida, al primer carácter sin convertir.

first2
Puntero al principio de la secuencia convertida.

last2
Puntero al final de la secuencia convertida.

next2
Puntero al CharType que viene después del último Chartype convertido, hasta el primer carácter sin modificaciones en la secuencia de destino.

Valor devuelto

Un valor devuelto que indica si la operación se ha realizado correctamente, parcialmente o no se ha realizado correctamente. La función devuelve:

  • codecvt_base::error si la secuencia de origen tiene un formato incorrecto.

  • codecvt_base::noconv si la función no realiza ninguna conversión.

  • codecvt_base::ok si la conversión se realiza correctamente.

  • codecvt_base::partial si el origen no es suficiente o si el destino no es lo suficientemente grande para que la conversión se realice correctamente.

Comentarios

state debe representar el estado de conversión inicial al principio de una nueva secuencia de origen. La función modifica su valor almacenado según sea necesario para reflejar el estado actual de una conversión correcta. Después de una conversión parcial, state debe establecerse de tal modo que permita que la conversión se reanude cuando lleguen nuevos caracteres.

La función miembro devuelve do_in( state, first1, last1, next1, first2, last2, next2).

Ejemplo

// codecvt_in.cpp
// compile with: /EHsc
#define _INTL
#include <locale>
#include <iostream>
using namespace std;
#define LEN 90
int main( )
{
   const char* pszExt = "This is the string to be converted!";
   wchar_t pwszInt [LEN+1];
   memset(&pwszInt[0], 0, (sizeof(wchar_t))*(LEN+1));
   const char* pszNext;
   wchar_t* pwszNext;
   mbstate_t state = {0}; // zero-initialization represents the initial conversion state for mbstate_t
   locale loc("C");//English_Britain");//German_Germany
   int res = use_facet<codecvt<wchar_t, char, mbstate_t>>
     ( loc ).in( state,
          pszExt, &pszExt[strlen(pszExt)], pszNext,
          pwszInt, &pwszInt[strlen(pszExt)], pwszNext );
   pwszInt[strlen(pszExt)] = 0;
   wcout << ( res!=codecvt_base::error ?  L"It worked! " : L"It didn't work! " )
       << L"The converted string is:\n ["
       << &pwszInt[0]
       << L"]" << '\n';
   exit(-1);
}
It worked! The converted string is:
[This is the string to be converted!]

codecvt::intern_type

Tipo de carácter que se usa para las representaciones internas.

typedef CharType intern_type;

Comentarios

El tipo es un sinónimo del parámetro de plantilla CharType.

codecvt::length

Determina cuántos valores Byte de una secuencia determinada de valores Byte externos generan no más de un número determinado de valores CharType internos y devuelve ese número de valores Byte.

int length(
    const StateType& state,
    const Byte* first1,
    const Byte* last1,
    size_t len2) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first1
Puntero al principio de la secuencia externa.

last1
Puntero al final de la secuencia externa.

len2
El número máximo de Bytes que puede devolver la función miembro.

Valor devuelto

Un entero que representa el número máximo de conversiones, no mayor que len2, definido por la secuencia de origen externo en [ first1, last1).

Comentarios

La función miembro devuelve do_length( state, first1, last1, len2).

Ejemplo

// codecvt_length.cpp
// compile with: /EHsc
#define _INTL
#include <locale>
#include <iostream>
using namespace std;
#define LEN 90
int main( )
{
   const char* pszExt = "This is the string whose length is to be measured!";
   mbstate_t state = {0}; // zero-initialization represents the initial conversion state for mbstate_t
   locale loc("C"); // English_Britain"); //German_Germany
   int res = use_facet<codecvt<wchar_t, char, mbstate_t>>
     ( loc ).length( state,
          pszExt, &pszExt[strlen(pszExt)], LEN );
   cout << "The length of the string is: ";
   wcout << res;
   cout << "." << '\n';
   exit(-1);
}
The length of the string is: 50.

codecvt::max_length

Devuelve el número máximo de valores Byte externos necesarios para generar un CharType interno.

int max_length() const throw();

Valor devuelto

El número máximo de valores Byte necesarios para generar un CharType.

Comentarios

La función miembro devuelve do_max_length.

Ejemplo

// codecvt_max_length.cpp
// compile with: /EHsc
#define _INTL
#include <locale>
#include <iostream>
using namespace std;

int main( )
{
   locale loc( "C");//English_Britain" );//German_Germany
   int res = use_facet<codecvt<char, char, mbstate_t>>
     ( loc ).max_length( );
   wcout << res << '\n';
}
1

codecvt::out

Convierte una secuencia de valores CharType internos en una secuencia de valores Byte externos.

result out(
    StateType& state,
    const CharType* first1,
    const CharType* last1,
    const CharType*& next1,
    Byte* first2,
    Byte* last2,
    Byte*& next2) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first1
Puntero al principio de la secuencia que se va a convertir.

last1
Puntero al final de la secuencia que se va a convertir.

next1
Referencia a un puntero al primer CharType sin convertir, después del último CharType convertido.

first2
Puntero al principio de la secuencia convertida.

last2
Puntero al final de la secuencia convertida.

next2
Referencia a un puntero al primer Byte sin convertir, después del último Byte convertido.

Valor devuelto

La función miembro devuelve do_out( state, first1, last1, next1, first2, last2, next2).

Comentarios

Para obtener más información, vea codecvt::do_out.

Ejemplo

// codecvt_out.cpp
// compile with: /EHsc
#define _INTL
#include <locale>
#include <iostream>
#include <wchar.h>
using namespace std;
#define LEN 90
int main( )
{
    char pszExt[LEN + 1];
    const wchar_t* pwszInt = L"This is the wchar_t string to be converted.";
    memset(&pszExt[0], 0, (sizeof(char)) * (LEN + 1));
    char* pszNext;
    const wchar_t* pwszNext;
    mbstate_t state;
    locale loc("C");//English_Britain");//German_Germany
    int res = use_facet<codecvt<wchar_t, char, mbstate_t>>
        (loc).out(state,
            pwszInt, &pwszInt[wcslen(pwszInt)], pwszNext,
            pszExt, &pszExt[wcslen(pwszInt)], pszNext);
    pszExt[wcslen(pwszInt)] = 0;
    cout << (res != codecvt_base::error ? "It worked: " : "It didn't work: ")
        << "The converted string is:\n ["
        << &pszExt[0]
        << "]" << '\n';

}
It worked: The converted string is:
[This is the wchar_t string to be converted.]

codecvt::state_type

Tipo de carácter que se usa para representar los estados intermedios durante las conversiones entre las representaciones internas y externas.

typedef StateType state_type;

Comentarios

El tipo es un sinónimo del parámetro de plantilla StateType.

codecvt::unshift

Proporciona los valores Byte necesarios en una conversión dependiente del estado para completar el último carácter de una secuencia de valores Byte.

result unshift(
    StateType& state,
    Byte* first2,
    Byte* last2,
    Byte*& next2) const;

Parámetros

state
El estado de conversión que se mantiene entre las llamadas a la función miembro.

first2
Puntero a la primera posición del intervalo de destino.

last2
Puntero a la última posición del intervalo de destino.

next2
Puntero al primer elemento sin modificaciones en la secuencia de destino.

Valor devuelto

La función devuelve:

  • codecvt_base::error si el estado representa un estado no válido.

  • codecvt_base::noconv si la función no realiza ninguna conversión.

  • codecvt_base::ok si la conversión se realiza correctamente.

  • codecvt_base::partial si el destino no es lo bastante grande para que la conversión se realice correctamente.

Comentarios

La función miembro virtual protegida intenta convertir el elemento de origen CharType(0) en una secuencia de destino que almacena en [first2, last2), excepto el elemento que finaliza Byte(0). Siempre almacena en next2 un puntero al primer elemento sin modificaciones en la secuencia de destino.

state debe representar el estado de conversión inicial al principio de una nueva secuencia de origen. La función modifica su valor almacenado según sea necesario para reflejar el estado actual de una conversión correcta. Normalmente, al convertir el elemento de origen CharType(0), el estado actual queda en el estado de conversión inicial.

La función miembro devuelve do_unshift( state, first2, last2, next2 ).

Consulte también

<locale>
Páginas de códigos
Nombres de configuración regional, idiomas y cadenas de país/región
Seguridad para subprocesos en la biblioteca estándar de C++