2

phpを使用してmysqlデータベースに特定の文字を入力するときに、いくつかの問題が発生しました。私がやっていることは、ユーザーが入力したテキストをデータベースに送信することです。あらゆる種類の文字をデータベースに入れて、phpを介して出力できるようにするために、何を変更する必要があるのか​​理解できません。

私のMySQL照合は次のとおりです:latin1_swedish_ci

フォームからデータベースにテキストを送信する直前に、データに対してmysql_real_escape_string()を使用します。

以下の例

このテキスト:

�People are just as happy as they make up their minds to be.�
� Abraham Lincoln 

次のようになります。

“People are just as happy as they make up their minds to be.”
― Abraham Lincoln
4

7 に答える 7

7

他の人が述べているように、「特殊」文字をサポートする場合は、エンドツーエンドでUTF8に変換する必要があります。これは、Webページ、PHP、mysql接続、およびmysqlテーブルを意味します。Webページはかなり単純で、UTF8のメタタグを使用するだけです。理想的には、ヘッダーにはUTF8も表示されます。

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

UTF8を使用するようにPHPを設定します。とにかく物事はおそらくうまくいくでしょうが、これを行うのは良い方法です:

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');

mysqlの場合、テーブルをUTF8に変換する必要があり、エクスポート/インポートする必要はありません。

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8

mysqlをデフォルトのutf8に設定することができます。ただし、クエリを実行することもできます。

 SET NAMES UTF8

接続を確立した後の最初のクエリとして、データベース接続をUTF8に「変換」します。

これで、文字表示の問題がすべて解決するはずです。

于 2012-10-20T04:03:37.673 に答える
3

この問題の最も可能性の高い原因は、データベース接続がに設定されてlatin1いるが、UTF-8でエンコードされたテキストをフィードしていることです。これを解決する最も簡単な方法は、入力をクライアントが期待するものに変換することです。

$quote = iconv("UTF-8", "WINDOWS-1252//TRANSLIT", $quote);

(MySQLが呼び出すlatin1のは他の地域ではwindows-1252です。)そこで使用する引用ダッシュU + 2015などの多くの文字は、このエンコーディングでは表現できず、別の文字に変換されることに注意してください。理想的には、列のエンコーディングをに変更する必要がありますutf8

別の解決策:データベース接続をに設定しますutf8。列がどのようにエンコードされているかは関係ありません。MySQLはテキストを接続エンコーディングからストレージエンコーディングに内部的に変換します。必要に応じて列を保持できますlatin1。(そうすると、引用ダッシュU + 2015は疑問符になります。これは、に含まれ?ていないためですlatin1

接続エンコーディングの設定方法は、使用しているライブラリによって異なります。非推奨のMySQLライブラリを使用する場合はmysql_set_charset、MySQLiの場合はmysqli_set_charset、PDOをencoding=utf8DSNに追加する場合はmysqli_set_charsetです。

これを行うと、Content-Typeヘッダーを使用してページエンコーディングをUTF-8に設定することになります。そうしないと、ブラウザで同じ問題が発生します。何か他のものを期待しているときに、UTF-8でエンコードされたテキストをブラウザにフィードします。

header("Content-Type: text/html; charset=utf-8");
于 2012-10-20T14:41:40.960 に答える
1

提供されるソリューションは、最初から始める場合に役立ちます。UTF-8へのすべての可能な接続を配置することは確かに最も安全です。UTF-8は、さまざまな理由でネット上で最も使用されている文字セットです。

いくつかの提案と警告の言葉:

  • サニタイズするテーブルを一意のプレフィックス(tmp_)でコピーします
  • db-connectionは強制的にutf8になりますが、一般設定の照合を確認し、まだ行われていない場合はutf8_binに変更してください。
  • これをローカルサーバーで実行する必要があります
  • 面白いcharエラーは、主にLATIN1とUTF-8構成の混合が原因です。このソリューションは、このために設計されています。LATIN1の他の使用済み文字セットで動作する可能性がありますが、私はこれをチェックしていません
  • 元にコピーして戻す前に、これらのtmp_tablesを十分に確認してください

魔法に必要な2つの配列を構築します。

$chars = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES, "UTF-8");
$LATIN1 = $UTF8 = array();
while (list($key,$val) = each ($chars)) {
    $UTF8[] = $key;
    $LATIN1[] = $val;
}

次に、必要なルーチンを作成します:(テーブル->)行->フィールドおよび各フィールド呼び出しで

$row[$field] = mysql_real_escape_string(str_replace($LATIN1 , $UTF8 , $row[$field]));
$q[] = "$field = '{$row[$field]}'";

最後に、クエリを作成して送信します。

mysql_query("UPDATE $table SET " . implode(" , " , $q) . " WHERE id = '{$row['id']}' LIMIT 1");
于 2013-07-20T15:00:15.423 に答える
0

MySQL照合をutf8_unicode_ciまたはutf8_general_ciに変更します(テーブルとデータベースを含む)。

于 2012-10-20T02:58:23.540 に答える
0

データベースをutf-8で設定する必要があります。それを行うには多くの方法があります。設定ファイルを変更するか、phpmyadminを使用するか、mysqlを挿入して更新する直前にphp関数(申し訳ありませんがメモリブランク)を呼び出します。

残念ながら、以前に入力したデータはすべて再入力する必要があると思います。

また、個人的な経験から、関係のあるすべてのテーブルが同じ照合を持っていることを確認する必要があります。そうしないと、それらを結合できなくなります。

参照として: http: //dev.mysql.com/doc/refman/5.6/en/charset-syntax.html

また、私はアパッチの設定になることができます。「フリーホスティング」サーバーと私の兄弟のサーバーで同じ問題が発生しました。別のサーバーに切り替えると、すべての文字がきれいになります。apacheの設定を確認してください。申し訳ありませんが、apacheの構成にこれ以上の光を当てることはできません。

于 2012-10-20T03:20:09.967 に答える
0

これらの2つのポイントに従う必要があるすべてを取り除くと、特殊言語の文字に関するすべての問題が解決されます。

1-テーブルの照合をutf8_general_ciに定義する必要があります。

<meta http-equiv="content-type" content="text/html; charset=utf-8">2- headタグの後にHTMLで定義します。

2-データベースと接続したファイルでを定義する必要がありmysql_set_charset('utf8',$link_identifier);ます。「mysql_select_db」のようにデータベースを選択した直後に、この「mysql_set_charset」を使用します。これにより、どの言語でもデータを適切に追加および取得できます。 。

于 2014-09-09T12:45:11.910 に答える
0

テキストが間違ったエンコーディングでエンコードおよびデコードされていて、文字化けが実際にUnicode文字に「固化」されている場合、これまでに説明したソリューションは機能しません。私はPythonパッケージで成功し、ftfy文字化けを自動的に検出/修正しました。

>>> import ftfy
>>> print(ftfy.fix_encoding("(ง'⌣')ง&quot;))
(ง'⌣')ง

うまくいけば、これは同様の状況にある人々を助けるでしょう。

于 2021-03-16T16:58:53.477 に答える