Cómo convertir en datos UTF-8 y viceversa

En este tema se describe cómo enviar y recuperar datos con codificación UTF-8 mediante el Controlador de SQL Server para PHP. En los procedimientos de este tema se usa la función iconv de PHP. Para obtener más información, vea iconv documentation.

En la versión 1.0 del Controlador de SQL Server para PHP, este era el único método para enviar o recuperar datos UTF-8. Sin embargo, en la versión 1.1 la aplicación ya tiene que convertir en datos UTF-8 y viceversa. Para obtener más información, vea Cómo enviar y recuperar datos UTF-8 mediante la compatibilidad integrada con UTF-8.

Enviar datos con codificación UTF-8 al servidor

En este procedimiento se describe cómo enviar datos con codificación UTF-8 al servidor.

Para enviar datos con codificación UTF-8 al servidor

  1. Asegúrese de que la columna de destino es de tipo nchar o nvarchar.

  2. Convierta los datos a codificación UTF-16LE mediante la función iconv de PHP. Por ejemplo, si $data es la variable que contiene datos con codificación UTF-8, el código siguiente los convertirá a codificación UTF-16LE:

    $data = iconv("utf-8", "utf-16le", $data);
    
  3. Especifique el tipo de PHP como SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY) en la matriz de parámetros. Por ejemplo, si $data es el parámetro que se envía, el código siguiente define el tipo de PHP en la matriz de parámetros:

    $params = array( 
                     array($data, 
                           null, 
                           SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY)
                           )
                    );
    

Recuperar datos con codificación UTF-8

En este procedimiento se describe cómo recuperar datos con codificación UTF-8. En este procedimiento se supone que los datos que se van a recuperar se han almacenado en el servidor con codificación UTF-16LE (vea el procedimiento anterior).

Par recuperar datos con codificación UTF-8

  1. Use la función sqlsrv_get_field para recuperar los datos. Para obtener más información acerca de cómo recuperar datos con la función sqlsrv_get_field, vea Cómo recuperar un campo único.

  2. Especifique el tipo de PHP como SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY). Por ejemplo, el código siguiente especifica el tipo de PHP:

    $data = sqlsrv_get_field($stmt, 0, 
                      SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY));
    

    Para obtener más información acerca de cómo especificar el tipo de PHP, vea Cómo especificar tipos de datos de PHP.

  3. Use la función iconv de PHP para convertir los datos a codificación UTF-8. Por ejemplo, el código siguiente convierte $data de codificación UTF-16LE a codificación UTF-8:

    $data = iconv("utf-16le", "utf-8", $data);
    

Ejemplo

En el ejemplo siguiente se muestra cómo enviar y recuperar datos con codificación UTF-8. En el ejemplo se actualiza la columna Comments de la tabla Production.ProductReview para un identificador de revisión especificado. En el ejemplo también se recuperan los datos recién actualizados y se muestran. Tenga en cuenta que la columna Comments es de tipo nvarcahr(3850). Además, observe que antes de que se envíen los datos al servidor se convierten a codificación UTF-8 mediante la función utf8_encode de PHP. utf8_encode se usa únicamente con fines de demostración. En un escenario de aplicación se comenzaría con datos con codificación UTF-8.)

En el ejemplo, se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Cuando se ejecuta el ejemplo desde el explorador, todos los resultados se escriben en el explorador.

<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.<br>";
     die( print_r( sqlsrv_errors(), true));
}

/* Set up the Transact-SQL query. */
$tsql1 = "UPDATE Production.ProductReview
          SET Comments = ?
          WHERE ProductReviewID = ?";

/* Set the parameter values and put them in an array. 
Note that $comments is converted to UTF-8 encoding with the PHP
function utf8_encode for demonstration purposes only. In an application
scenario you would begin with UTF-8 encoded data. Before sending the
UTF-8 data to the server, it is converted to UTF-16LE with the PHP iconv
function. */
$reviewID = 4;
$comments = utf8_encode("[Insert comment here.]");
$comments = iconv("utf-8", "utf-16le", $comments);
$params1 = array(
                  array($comments,
                        null,
                        SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY)),
                  array($reviewID, null)
                );

/* Execute the query. */
$stmt1 = sqlsrv_query($conn, $tsql1, $params1);
if( $stmt1 === false )
{
     echo "Error in statement execution.<br>";
     die( print_r( sqlsrv_errors(), true));
}
else
{
     echo "The update was successfully executed.<br>";
}

/* Retrieve the newly updated data. */
$tsql2 = "SELECT Comments 
          FROM Production.ProductReview 
          WHERE ProductReviewID = ?";

/* Set up the parameter array. */
$params2 = array($reviewID);

/* Execute the query. */
$stmt2 = sqlsrv_query($conn, $tsql2, $params2);
if( $stmt2 === false )
{
     echo "Error in statement execution.<br>";
     die( print_r( sqlsrv_errors(), true));
}

/*Retrieve and display the data. Note the PHPTYPE specification and the
use of the PHP iconv function to convert the data from UTF-16LE encoding
to UTF-8 encoding. */
if( sqlsrv_fetch($stmt2) )
{
    echo "Comments: ";
    $data = sqlsrv_get_field($stmt2, 
                             0, 
                             SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY));
    $data = iconv("utf-16le", "utf-8", $data);
    echo $data."<br>";
}
else
{
     echo "Error in fetching data.<br>";
     die( print_r( sqlsrv_errors(), true));
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt1 );
sqlsrv_free_stmt( $stmt2 );
sqlsrv_close( $conn);
?>

Para obtener información acerca de cómo almacenar datos Unicode, vea Trabajar con datos Unicode.

Vea también

Tareas

Aplicación de ejemplo

Conceptos

Constantes SQLSRV

Otros recursos

Recuperar datos
Actualizar datos (Controlador de SQL Server para PHP)
Referencia de la API (Controlador SQL Server para PHP)