1

私のプロジェクトは PHP 上に構築され、MS SQL Server に接続します。sqlsrv ライブラリを使用しています。MS SQL のフィールド タイプは nvarchar です。接続のパラメーターを定義するときに、「utf8」も入力します。それは:

global $cnf;
$cnf = array();
$cnf["mssql_user"]  = "xxx";
$cnf["mssql_host"]  = "xxx";
$cnf["mssql_pw"]    = "xxx";
$cnf["mssql_db"]    = "xxx";
$cnf["CharacterSet"]    = "**UTF-8**";

レコードをデータベースに挿入するとき、ベトナム語のコンテンツと中国語のコンテンツの場合、次を使用します。

$city = iconv('UTF-8', 'utf-16le', $post['city']);
$params = array(array($city, null, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY)));
$sql= "INSERT INTO tblCityGarden (city) VALUES(?)
$stmt   = sqlsrv_query( $this->dbhandle, $sql, $params);

ベトナム語と中国語のデータは正常に挿入されます (ベトナム語と中国語のデータベースに格納されているデータは正しい)。

しかし、レコードを再度 Web にロードすると、奇妙な文字 (?、�) が表示されます。私はいくつかのphpをiconv、mb_detect_encoding、mb_convert_encodingとして試し、インターネットで多くの結果を検索しましたが、うまくいきません。正しいデータを表示するにはどうすればよいですか

この問題について経験のある人をお願いします

4

1 に答える 1

1

これと同じ問題 (�) がありましたが、一重引用符、二重引用符、および "Rights Reserved" 文字を使用していました...これが私が見つけたものです:

  • 指定されたCharacterSetものは「すべてを支配する」ように見えるので、これを何に設定するかによって、接続のエンコーディングが決定されます(そうあるべきです)。CharacterSet接続に ANY を設定していませんでした。これを設定するだけで問題が解決し、DB に挿入された値が を介して二重にエンコードされていないことを確認しましたhtmlspecialchars()
  • header() はすべての出力の前に設定する必要があります (これは非常に重要です)
  • ドキュメントの後半でヘッダーを別のものに設定することはできません
  • PHP ファイルの終了の前および/または後の末尾のスペース?>が問題を引き起こす場合があります (私はこの終了タグを使用しませんが、検索中にこれについて多く言及されているのを見ました)。

私は に精通してiconv()おらず、エンコーディング全般の経験がないことは間違いありませんが、時間をかけてヘッダーをチェックし、上記の基準を満たしていることを確認するだけで問題を解決しました...

クエリ パラメータも奇妙に見えます。 $params = array(array($city, null, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY)));

その引数に渡された多次元配列を見たことがありません...(単なるメモ)

于 2015-10-16T18:29:15.320 に答える