3

ここに翻訳機能のあるページがあります。ここでの問題は、その言語をフランス語に翻訳すると、ページが単語を正しく解釈しなかったために単語がカットされることです。問題に関連する投稿を確認しましたが、どれも機能しません。

私のページでは、これらのものを入れました:

  • header ('Content-Type:text/html; charset=WINDOWS-1252');-> これは、起動時にエンコーディングを強制するためのものです。これはオプションだと思いますが、まだ使用しています。
  • <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
  • データベース tablename: labelsから同等の翻訳が取得されます。Labelsのテーブル タイプは、デフォルトの文字セットとしてutf8 -- UTF-8 Unicodeを使用する InnoDB です。

é以降の文字をカットしています。文字を正しく表示するために必要なことはありますか? ありがとう!

4

3 に答える 3

2

多言語アプリケーションのバックエンドで Unicode を使用し、フロントエンドでコード ページを使用しても意味がありません。プロジェクト全体で同じエンコーディングを使用するか、 と の間で手動で変換しUTF-8ますwindows-1252

読むのに問題はないと思います。ラベルは DB から切り捨てられます。そうしないと、ブラウザに文字化けが表示されます。したがって、これは PHP/HTML の問題ではなく、MySQL の問題です。などの場合èéàòì、MySQL は確かに UTF-8 から CP1252 (latin1) に変換できます。ただし、そうでない場合 (同じ文字列を UTF-8 から CP1251 に変換しようとした場合など)、MySQL は疑問符を表示し?ます。

あなたの場合、それは入力の問題だと思います。つまり、DB でラベルが切り捨てられています。これはどのように可能ですか?UTF8 の PHP と MySQL を使用windows-1252している場合でも、そのような文字セットで読み込まれたページからフォームを送信すると、ブラウザーは文字列を送信します。UTF-8 PHP スクリプトでは、データベースに挿入する前にこの文字列を にトランスコードするか、 を使用して MySQL に接続する必要がありますSET NAMES 'CP1252'。そうしないと、無効な UTF-8 バイトの束を挿入しようとすることになり、MySQL は文字列を切り捨て、ラベルは空になります。添付はテストケースです。ここにtestテーブルがあります

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

これがPHP部分です。このスクリプトは UTF-8 でエンコードされているため、スクリプトに含まれるすべてのリテラル文字列は同じエンコードであることに注意してください。

// This is a UTF-8 file, so my editor uses UTF-8 and thus each literal
// string is a UTF-8 string, since PHP only has binary strings.
$label = "Référence";

// Now let's translate this string as if it came from a browser submitting
// a form loaded from a cp1252 encoded page
$src = mb_convert_encoding($label, "CP1252", "UTF-8");

// But connect as if I were UTF-8
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8',
    'test', 'test');

// Insert the string
$stmt = $db->prepare('INSERT INTO test (name) VALUES ( ? )');
$stmt->bindValue(1, $src);
$stmt->execute();

// Read it
header("content-type: text/plain; charset=windows-1252");
foreach($db->query('SELECT * FROM test') as $row)
    echo $row['name'] . "\n";

どのように回復しますか?文字セットを使用して MySQL に接続し、cp1252MySQL に翻訳させるか、スクリプトで文字列をトランスコードします。

データを正しく取得したら、それらを抽出して HTML ページに配置する必要があります。今回は同じ問題が発生しますが、逆になります: CP1252 ドキュメントで UTF-8 文字列を表示します。CP1252 では char の長さが正確に 1 バイトであるのに対し、UTF-8 は可変長エンコーディングであるため、DB のバイトは不適切です。これらのバイトをページに直接配置すると、ブラウザは余分なバイトに対してランダムな意味不明な内容を表示します。繰り返しになりますが、CP1252文字セットを指定してデータベースに接続し、MySQL が変換を処理して適切なバイトを提供するようにするか、PHP 側で自分でバイトをトランスコードします。

または、自分に有利なことをしたほうがよいでしょう。どこでも同じエンコーディングを使用してください。UTF-8今日は正しいことなのでお勧めしますが、英語とフランス語の文字を表すことができるため、うまく選択できますCP1252(また、ストレージがいくらか節約されますが、これは問題ではないと思います)。

于 2012-09-27T08:30:36.840 に答える
1

私の提案は、プロセス全体で同じエンコーディングを使用することです。ヘッダーとメタ タグの両方で文字セットとして UTF-8 を使用します。

于 2012-09-27T06:37:46.867 に答える