0

スタック:

テキストフィールドを含む単純なフォーム => unix で実行されている Apache Web サーバーに投稿 => php 5.3 によって処理 => latin1 文字セットで mysql5 テーブルに保存

よりも、DB から取得され、ユーザーに表示されます。

結果: ユーザーがフォームに ® 記号を入力すると、1 つではなく 2 つの記号としてデータベースに保存され、ZPL プリンターで間違って表示されます。

ちなみに、Unix ではなく Windows を実行している開発マシンで同じものを実行すると、発生しません。

私は何を間違っていますか?

編集: mysql テーブルの文字セットを変更できません。latin1 の会社標準がありますが、これは好ましくありませんが、それでも変わりません。

4

2 に答える 2

1

文字エンコーディングは、シナリオの複数の場所でルールを果たします

  • パラメータをサーバーに送信するためにクライアントが使用するエンコーディング
  • PHPスクリプトからサーバーに送信される文字を解釈するためにmysqlサーバーが使用するエンコーディング
  • 結果をphpスクリプトに送り返すためにmysqlサーバーが使用するエンコーディング
  • mysql サーバーがデータを格納するために使用するエンコーディング
  • phpスクリプトからクライアント/ブラウザに送信されるデータをレンダリングするために、クライアント/ブラウザが使用するエンコーディング

チェーン全体を utf-8 エンコーディングに保つのが最も簡単です:
ブラウザに送信する html ドキュメントの文字エンコーディングを、たとえばdefault_charsetを介して utf-8 に設定します。PDO-MYSQL DSN
で charset プロパティを設定するなどして、接続文字セットが utf-8 であることを mysql サーバーに示します。 デフォルトの文字セットとして utf-8 を使用し、フィールド自体に別のエンコーディングを指定せずにテーブルを作成します。

自己完結型の例:

<?php
ini_set('default_charset', 'utf-8');
$fn = isset($_POST['val']) ? 'doDatabase' : 'doForm';
doHtml($fn);


function doHtml($fn) { ?>
<html>
    <head><title>...</title></head>
    <body>
        <?php $fn(); ?>
    </body>
</html>
<?php
}

function doForm() { ?>
    <form method="POST" action="?">
        <div>
            <input type="text" name="val" value="&reg;" />
            <input type="submit" />
        </div>
    </form>
<?php       
}

function doDatabase() {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $pdo->exec('
        CREATE TEMPORARY TABLE soFoo (
            id int auto_increment,
            val varchar(30),
            primary key(id)
        ) DEFAULT CHARACTER SET utf8
    ');

    $stmt   = $pdo->prepare('INSERT INTO soFoo (val) VALUES (?)');
    $stmt->execute( array($_POST['val']) );
    $stmt = null;

    foreach( $pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $row ) {
        echo 'row: ', join(', ', $row), "<br />\r\n";
    }
}
于 2013-04-24T11:38:05.973 に答える