0

SQLite3データベースからキリル文字をフェッチすると、perl(またはMojolicious、またはDBIx :: Class-正直なところわかりません)がバイトストリームのデコードに失敗する場合があります。たとえば、次のテキストがあります。

1984г1ф!!11четыре

出力は次のようになります。

1984г1ф!!11������
1984\x{433}1\x{444}!!11\x{fffd}\x{fffd}\x{fffd}\x{fffd}\x{fffd}\x{fffd}

なぜこうなった?これを修正する方法は?

更新:この問題の原因を追跡することができました。不正な形式の文字列がWebページのユーザー入力から取得され、パラメーターとしてコントローラーアクションにディスパッチされているようです:コードはこちら

保存アクションを実行すると、次のログが生成されます。

[2012/07/24 14:06:09] [DEBUG] 15703 Mojolicious.Plugin.RequestTimer - POST /admin/node/save (Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1).
[2012/07/24 14:06:09] [DEBUG] 15703 Mojolicious.Routes - Routing to a callback.
[2012/07/24 14:06:09] [DEBUG] 15703 Mojolicious.Routes - Routing to controller "MyApp::Admin" and action "save".
Wide character in print at /home/nikita/perl5/lib/perl5/Log/Log4perl/Appender/File.pm line 245.
Wide character in print at /home/nikita/perl5/lib/perl5/Log/Log4perl/Appender/Screen.pm line 39.
[2012/07/24 14:06:09] [DEBUG] 15703 MyApp.Admin - 123123!!!11������������������

更新2:開発サーバーとしてMorboを使用しており、アプリケーションレイアウトにmetaヘッダーが含まれています。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

更新3:奇妙ですが、文字列が正しくエンコードされて表示される場合があります。

[2012/07/24 14:55:52] [DEBUG] 16451 Mojolicious.Routes - Routing to a callback.
[2012/07/24 14:55:52] [DEBUG] 16451 Mojolicious.Routes - Routing to controller "MyApp::Admin" and action "save".
[2012/07/24 14:55:52] [DEBUG] 16451 MyApp.Admin - 112!!ЫВафывафывп
[2012/07/24 14:55:52] [DEBUG] 16451 Mojolicious.Plugin.RequestTimer - 302 Found (0.326543s, 3.062/s).
[2012/07/24 14:55:52] [DEBUG] 16451 Mojolicious.Plugin.RequestTimer - GET /admin (Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1).

同じことを2回行うと、次のようになります。

[2012/07/24 14:57:30] [DEBUG] 16451 Mojolicious.Routes - Routing to controller "MyApp::Admin" and action "save".
Wide character in print at /home/nikita/perl5/lib/perl5/Log/Log4perl/Appender/File.pm line 245.
Wide character in print at /home/nikita/perl5/lib/perl5/Log/Log4perl/Appender/Screen.pm line 39.
[2012/07/24 14:57:30] [DEBUG] 16451 MyApp.Admin - 112!!��������������������
[2012/07/24 14:57:30] [DEBUG] 16451 Mojolicious.Plugin.RequestTimer - 302 Found (0.362417s, 2.759/s).
[2012/07/24 14:57:30] [DEBUG] 16451 Mojolicious.Plugin.RequestTimer - GET /admin (Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1).
4

2 に答える 2

1

「印刷中のワイド文字」の警告により、出力ファイルハンドルでutf-8文字が表示されることを想定していないように思われます。

perldiagのマニュアルページでは、Perlのエラーと警告について詳しく説明しています。この警告についての説明は次のとおりです。

%sのワイド文字

(S utf8)Perlは、予期していなかったときにワイド文字(> 255)に遭遇しました。この警告は、I / O(印刷など)ではデフォルトでオンになっています。この警告を静める最も簡単な方法は、出力に:utf8レイヤーを追加することです(例:binmode STDOUT、':utf8')。警告をオフにする別の方法は、警告を追加しないことです'utf8'; しかし、それはしばしば不正行為に近いです。一般に、ファイルハンドルをエンコーディングで明示的にマークすることになっています。openおよびbinmodeを参照してください。

Perl Unicodeチュートリアル(およびCamelブックの第4版の第6章)を読むことも有益だと思います。

于 2012-07-24T10:46:55.487 に答える
0

Removed

% use utf8;

from one of the templates, and after that text is displayed as it should.

于 2012-07-24T14:55:21.597 に答える