4

私は、Perl、MySQL 5、Apache、およびTemplateToolkitを使用しているWebベースの教育Webサイトで働いています。複数の言語のサポートを当社のWebサイトに導入する予定です。

私たちがしたこと

テンプレートファイルにCoursesMainPage <\ h1>のようなタブ名がある場合、それを次のように変換しました。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<h1>[% glossary.$language.courses_main_page %]<\h1> 

ここで、$ languageは、ユーザーがログインするときに選択する値を取得しています。

このデータをMysqlDBに保持するためのテーブルがあります。

CREATE TABLE translationenglishvarchar(255)NOT NULL、
languagevarchar(255)NOT NULL、 translationvarchar(2000)NOT NULL、)ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT='要素テキストの外国語への翻訳'

ここに画像の説明を入力してください

MySQLの接続機能では、「SETcharacter_set_results=NULL」を提供しています。utf8で試しましたが、一部のタブに限定される問題が多くのセクションで増加しました。

そのため、ユーザーがシステムにログインするとすぐに、すべての翻訳を取得してPERLハッシュに保存し、キャッシュします。このハッシュをテンプレートファイルに渡し、値を置き換えます。

問題:áやéなどの鋭いアクセント付き文字が、いくつかの異なる文字セット記号に置き換えられています。

例:フロントエンドでは、CursosPáginaPrincipalの「CursosPáginaPrincipal」が表示されています。

これは、 htmlentitiesおよびé(e急性)で与えられた解決策と非常によく似ています。

Perlで同じことを実現する方法を教えてもらえますか?

4

1 に答える 1

6

文字セットを示す

例:フロントエンドでは、CursosPáginaPrincipalの「CursosPáginaPrincipal」が表示されています。

この文字化けは、文字がUTF-8として転送されたが、ISO-8859-1または同様のものとして解釈された場合に発生します。したがって、これを修正する最も簡単な方法は、HTMLページが適切なmimeタイプでクライアントに送信されることを確認することです。

Content-Type: text/html; charset=utf-8

その情報がHTMLヘッダーに存在する場合、そこの値はHTMLドキュメント自体の設定を上書きします。したがって、HTMLヘッダーを設定するか、HTMLヘッダーで文字セットがまったく指定されていないことを確認してください。これにより、ブラウザーはメタ設定を確認できます。

一部のブラウザ(Firefoxなど)では、[表示]/[文字エンコード]を使用して文字セットを手動で変更できます。これを使用して、レンダリング中の間違った文字エンコードが本当に問題の原因であるかどうかを確認できます。

実際にエンコードとデコード

文字セットを修正しても効果がない場合があります。フレームワークのその部分を単に制御していない可能性があります。または、何かが文字をISO-8859-1からUTF-8に2回変換するため、読み取り不可能な記号は実際にはすでにUTF-8として表されています。このような場合、Encodeモジュールを使用して、出力としてHTML文字参照を使用し、Perlで文字を直接エンコードできます。

use Encode qw(decode encode FB_HTMLCREF);
# maybe: $unicodeString = decode("utf-8", $byteString);
$htmlString = encode("ascii", $unicodeString, FB_HTMLCREF);

decodeこの手順が必要かどうかは、データベースとの通信方法によって異なります。データベース接続がUnicodeをサポートできる場合は、すでにUnicode文字列があり、これらをHTMLにエンコードするだけです。DBD :: mysqlの場合、mysql_enable_utf8 => 1これを実現するパラメーターがあります。独自のコードでデコードするよりも、これを使用することをお勧めします。この回答には構文の詳細があります。

これらの関数の機能に関する1つの例:

$byteString    = "Cursos P\xc3\xa1gina Principal.";   # two bytes
$unicodeString = "Cursos P\N{U+00E1}gina Principal."; # one unicode character
$htmlString    = "Cursos P&#225;gina Principal.";     # html character reference
于 2013-03-06T13:12:40.540 に答える