php SQL结果不是英语字符

ulydmbyx  于 2022-12-10  发布在  PHP
关注(0)|答案(2)|浏览(116)

我一直在使用MySQL,但是现在我不得不使用SQL Server,我迷路了。我只想用西班牙语写一行,但是我不能让它工作。下面是代码,希望一切都有意义。

$connection = odbc_connect("Driver={SQL Server Native Client 11.0};Server=$server;Database=$database;", $user, $password);
$sql="SELECT * FROM my_table";
$res=odbc_exec($connection,$sql)or die(exit("Error en odbc_exec"));
while($arr = odbc_fetch_array($res)) {
    $var = $arr["OkRef"];
    echo "1.- ".iconv("Windows-1256", "UTF-8", "$var")."<br />";
    echo "2.- ".iconv("CP437", "UTF-8", $var)."<br />";
    echo "3.- ".iconv("CP850", "UTF-8", $var)."<br />";
    echo "4.- ".utf8_decode($arr["OkRef"])."<br />";
    echo "5.- ".utf8_encode($arr["OkRef"])."<br />";
    echo "6.- ".$arr["OkRef"]."<br />";
    echo "7.- ".mb_convert_encoding($arr["OkRef"], "utf-8", "windows-1251")."<br />";
    echo "8.- ".htmlspecialchars( iconv("iso-8859-1", "utf-8", $var) );
    }
}

我得到的结果是:
1.-第122节)
2.-Θr ατHσ¼ º d_元数据包1Y │º0 .122)─
3.-122)©─ ─
4.-数据包类型
5.-122)
6.-第一次发送的元数据包
7.-122)∨ Д ==============
8.-122)
我还试图添加以下内容(显然不是立刻添加),以使其按原样工作:

<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
header('Content-Type: text/html;charset=utf-8');
header('Content-Type: text/html;charset=iso-8859-1');
ini_set('mssql.charset', 'UTF-8');

服务器是Microsoft SQL Server企业版,服务器排序规则是Modern_Spanish_CI_AS。

zf2sa74q

zf2sa74q1#

我知道,这个答案发布得太晚了,但是我最近也遇到了类似的情况,所以我想分享一下我的经验。我的配置几乎是一样的-数据库和表列都使用Cyrillic_General_CS_AS排序规则。注意,我使用的是PHP驱动程序,而不是内置的ODBC支持。
下面的步骤帮助我解决了我的问题。我使用了你的例子中的排序规则。

数据库:

CREATE TABLE [dbo].[MyTable] (
    [TextInSpanish] [varchar](50) COLLATE Modern_Spanish_CI_AS NULL,
    [NTextInSpanish] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NULL
)

INSERT [dbo].[MyTable] (TextInSpanish, NTextInSpanish) 
VALUES ('Algunas palabras en español', N'Algunas palabras en español')

PHP代码:

在php.ini文件中设置default_charset = "UTF-8"。用UTF-8编码源文件。我使用Notepad++完成这一步。

从数据库读取数据:

  • 使用默认连接编码。若要从数据库阅读数据,请使用$data = iconv('CP1252', 'UTF-8', $data);。注意,默认情况下,数据以8位字符返回,该字符在系统上设置的Windows区域设置的代码页中指定。任何多字节字符或未Map到此代码页的字符都将替换为单字节问号(?)字符。这是默认编码。
  • 使用UTF-8连接编码。列的类型必须为“nchar”或“nvarchar”。
    HTML格式:

用途:<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

工作示例:

php(PHP 7.1,用于SQL Server 4.3的PHP驱动程序,文件test.php是UTF-8编码的):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta charset="utf-8">

<?php
// Connection settings
$server = '127.0.0.1\instance,port';
$database = 'database';
$user = 'username';
$password = 'password';
$cinfo = array(
    "CharacterSet"=>SQLSRV_ENC_CHAR,
    #"CharacterSet"=>"UTF-8",
    "Database"=>$database,
    "UID"=>$user,
    "PWD"=>$password
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false)
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}

// Query
$sql = "SELECT * FROM MyTable";
$res = sqlsrv_query($conn, $sql);
if ($res === false) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}

// Results
while ($arr = sqlsrv_fetch_array($res, SQLSRV_FETCH_ASSOC)) {
    # Use next 2 lines with "CharacterSet"=>SQLSRV_ENC_CHAR connection setting
    echo iconv('CP1252', 'UTF-8', $arr['TextInSpanish'])."</br>";
    echo iconv('CP1252', 'UTF-8', $arr['NTextInSpanish'])."</br>";
    # Use next 2 lines with "CharacterSet"=>"UTF-8" connection setting
    #echo $arr['TextInSpanish']."</br>";
    #echo $arr['NTextInSpanish']."</br>";
}

// End
sqlsrv_free_stmt($res);
sqlsrv_close($conn);
?>

    </head>
    <body></body>
</html>
crcmnpdw

crcmnpdw2#

天啊,这就成功了:“$data = iconv('CP 1252','UTF-8',$数据);“或者在我的情况下:
如果您有任何问题,请联系我们。
如果您是一个用户,请输入以下命令:
过去三天我一直在寻找解决办法!谢谢你,若洛夫!

相关问题