5

PHPを使用してISO-8859-1データベースのコンテンツをUTF-8に変換する際に問題が発生しました。テストするために次のコードを実行しています。

// Connect to a latin1 charset database 
// and retrieve "Georgia O’Keeffe", which contains a "’" character
$connection = mysql_connect('*****', '*****', '*****');
mysql_select_db('*****', $connection);
mysql_set_charset('latin1', $connection);
$result = mysql_query('SELECT notes FROM categories WHERE id = 16', $connection);
$latin1Str = mysql_result($result, 0);
$latin1Str = substr($latin1Str, strpos($latin1Str, 'Georgia'), 16);

// Try to convert it to UTF-8
$utf8Str = iconv('ISO-8859-1', 'UTF-8', $latin1Str);

// Output both
var_dump($latin1Str);
var_dump($utf8Str);

これをFirefoxのソースビューで実行すると、Firefoxのエンコーディング設定が「Western(ISO-8859-1)」に設定されていることを確認すると、次のようになります。

asd

ここまでは順調ですね。最初の出力にはその奇妙な引用が含まれており、ISO-8859-1であり、Firefoxでもあるため、正しく表示されます。

Firefoxのエンコーディング設定を「UTF-8」に変更すると、次のようになります。

asd

見積もりはどこに行きましたか?iconv()それをUTF-8に変換することになっていないのですか?

4

2 に答える 2

16

U + 2019 RIGHT SINGLEQUOTATIONMARKはISO-8859-1の文字ではありません。これは、windows-1252では0x92の文字です。実際のISO-8859-1文字0x92は、「PrivateUse2 」と呼ばれるめったに使用されないC1制御文字です。

Windows-1252テキストデータに文字セットラベルISO-8859-1の誤ったラベルを付けることは非常に一般的です。多くのWebブラウザおよび電子メールクライアントは、このような誤ったラベル付けに対応するために、MIME文字セットISO-8859-1をWindows-1252文字として扱いますが、これは標準の動作ではなく、ISO-8859-1でこれらの文字を生成しないように注意する必要があります。ラベル付きコンテンツ。

これがここで起こっていることのようです。「ISO-8859-1」を「windows-1252」に変更します。

于 2010-09-15T01:40:14.443 に答える
0

charsetこれにより、ページヘッダーがutf-8であると仮定して、問題が解決します。

// Opens a connection to a MySQL server
$connection = mysql_connect ($server, $username, $password);
$charset = mysql_client_encoding($connection);
$flagChange = mysql_set_charset('utf8', $connection);
echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>";
于 2013-12-04T20:51:49.390 に答える