warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in /var/www/html/drupal/includes/bootstrap.inc on line 857.

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
Anonymous's picture

はじめまして
Drupalをはじめた初心者です。
大変恐れ入りますが質問をさせてください。

Viewsの設定で
”ページ”を作ると
下記のようなエラーが(赤枠で)表示されてしまいます。
warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument in /var/www/html/drupal/includes/bootstrap.inc on line 857.

これはどのように対処したらよいものなのでしょうか?

現在、オプションのモジュールには
CCK,Views
だけを入れた状態です。

テーマはMarinelliだけを追加し
現在Marinelliを使っています。

当方の環境はレンタルサーバー(VPS)
MySQLデータベース 5.0.51a
ウェブサーバ Apache/2.0.63 (Red Hat)
PHP 5.2.6
Drupal 6.19

です。
ご多忙の中恐れ入りますがよろしくお願いいたします。

Comments

dokumori's picture

最新のCCKでのみ生じる、比較的新しいバグのようです。解決法はまだないようです。
http://drupal.org/node/894880
僕自身はこのエラーを見ていないし、検証もしていないので、違うかも知れませんが。

ちなみにエラーを非表示にしたい場合、example.com/admin/settings/error-reporting から行うことができます。

dokumori様 ありがとうございます

umimono's picture

dokumori様この度はありがとうございます。
なるほどCCKに起因しているようですね。
(drupal.orgのIssuesでの探し方も勉強になりました。)

とりあえずそこは保留にして、他を進めながら様子を見てみます。
該当のバグ報告に私も報告しました。

ちなみにエラーを非表示にしたい場合、example.com/admin/settings/error-reporting から行うことができます。
なるほどエラーを画面に出さないで、ログにだけ残すということですね。

phpもDrupalをきっかけに勉強中でして、
皆様のご迷惑にならないよう
出来るだけ自力でがんばるつもりですが・・・

今後ともよろしくお願いいたします。
ありがとうございました。

umimono

taka4nev's picture

はじめまして、古い問題なので既に解決していたら失礼致します。
一応後から見られる方へ参考になればと思います。

私の場合もViewsでページ作成で表示されました。

【原因調査方法】
このhtmlspecialchars()のエラーは「文字化け文字」を処理しようとした時に起きるようです。
調査する場合は、該当の箇所の↓処理しようとしているテキストを表示してみましょう。
/var/www/html/drupal/includes/bootstrap.inc on line 857

return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');

↑なので、
print $text;
すると、結構出力されるのですが、「文字化け文字」が発見出来ます。
私の場合は、Viewsのページ設定のメニュー欄の「 メニューな?」でした。
質問者の場合もViewsのページ追加のタイミングなので同じだと思います。

【対応方法】
ここまで分かれば、楽勝♪
日本語翻訳ファイルの問題なので、修正してあげましょう。
管理画面から「インターフェイスの翻訳」を呼び出し、検索タブにて「含まれる文字列」に今回の「文字化け文字」を入力して検索です。

文字化け文字→メニューな

すると、ヒットしたと思います。
今回は翻訳を戻して、原文の「No menu」にしました。

翻訳ファイルに関しては、私のような日本語人には非常に助かっています、これくらいの修正で済むなら、お安いものですね。

http://twitter.com/#!/taka4nev

報告ありがとうございます。 l.d.o/ja

dokumori's picture

報告ありがとうございます。
l.d.o/ja 上で、また翻訳ファイル内で文字列を確認してみましたが、特に問題は見当たりませんでした。その「No menu」をインターフェイス翻訳機能で再び「メニューなし」にしなおした場合、エラーは再発するんでしょうか?再発しない場合、インポート時に何かが問題で「し」が化ける...のかな?...興味深い問題です。

ご提案の件、試してみました。

taka4nev's picture

コメントありがとうございます。

ご提案の件、試してみました。


その「No menu」をインターフェイス翻訳機能で再び「メニューなし」にしなおした場合、エラーは再発するんでしょうか?

結果は再発します、どうも「長音」がらみで起きるようです。
「めにゅーなし」、「メニューナシ」、「アイウエオーあいうえお」でも文字化け、「メニュなし」は文字化けしません。

一応文字化けしているViewsの画面をアップしてみました。
http://twitpic.com/7gfbfm

http://twitter.com/#!/taka4nev

PHPが古すぎ..

yohgaki's picture

これはhtmlentitiesのバグでしょうね。結構いろいろ直してますから。PHPが古すぎです。VPSということなのでPHP 5.3の最新版で使うのが良いと思います。。

もう少し調べてみました。

taka4nev's picture

コメントありがとうございます。

PHPが古すぎです。VPSということなのでPHP 5.3の最新版で使うのが良いと思います。。

すいません、自分のサーバ環境を報告していませんでした。私もVPS(さくらVPS)ですが、PHP5.3.6にしています。
今更気づいたのですが、「インターフェイス翻訳機能」で再度呼び出した時は「メニューなし」と文字化けしていなかったので、登録自体は正常に行なわれているようです。

ここからは予想ですが、Views管理画面(admin/build/views)での文字化けが最後の1文字だけだったので、Views側から特殊文字をエンコードするために「includes/bootstrap.inc on line 857.」の「check_plain」関数を呼び出す時に、Views管理画面での表示を考えてか(予想です)、bye数指定して抜き出した、翻訳文字を引数として渡しているような気がします。
※文字化けしているのは、「htmlentities」処理前の時点からでした。

試しに翻訳文字を「1234567...」と入力したら、16文字=16byte 有効でした。
utf-8は「カタカナ」、「ひらがな」表示に1文字に3byte使います。
※ utf-8コード表 http://charset.7jp.net/jis0208.html

そのため「メニューなし」の場合だと、「メニューな」の5文字で15byte消費して、「し」の「文字コード3byte」のうち、「1byte=1/3文字コード」抜き出してしまい、文字化けしている気がします。
本当はViewsの管理画面を構築しているphpコードを探せれば良いのですが、Moduleに関しては勉強不足のため、現象からの予想です。

http://twitter.com/#!/taka4nev

こんにちは、taka4nevさんもう解決されているとは思

jun784's picture

こんにちは、taka4nevさん

ご丁寧にありがとうございます。
もう解決されているとは思いますが、コードの補足をさせてくださいっ。

お察しの通り、drupal6では以下の様になっており、16byteで切られてしまいます。

<?php
// views_plugin_display_page.inc:209
   
if (strlen($path) > 16) {
     
$path = substr($path, 0, 16) . '...';
    }
?>

drupal7ではこちらは以下のように改善されています。

<?php
// views_plugin_display_page.inc:271
   
$options['menu'] = array(
     
'category' => 'page',
     
'title' => t('Menu'),
     
'value' => views_ui_truncate($menu_str, 24),
    );
?>

<?php
 
//views_ui.module:860
/**
* Truncate strings to a set length and provide a ... if they truncated.
<em>
* This is often used in the UI to ensure long strings fit.
*/
function views_ui_truncate($string, $length) {
  if (
drupal_strlen($string) > $length) {
   
$string = drupal_substr($string, 0, $length);
   
$string .= '...';
  }

  return
$string;
}

/*****
</em>  function drupal_substr()
http://api.drupal.org/api/drupal/includes--unicode.inc/function/drupal_s...
*****/
?>

以前に一度私も同じ現象になったのですが、実際のメニューの表示は問題がなかったので報告していませんでした。
ただ、7では修正されていることから何かしら報告はあったみたいですね。

taka4nev's picture

jun784さんありがとうございます。

既に検出済みの事象だったんですね。

丁寧にソースありがとうございます。
これを見本にちょっとはmoduleも追えるように勉強してみます。
自分だと管理画面止まりなので大変参考になりました。

皆さんDrupal7に移行しているようですね。
自分もプライベートから7も手を付けようと思います。(なかなか億劫で。。。。)

twitterフォローします、宜しくお願い致します。

http://twitter.com/#!/taka4nev

@jun784 + @taka4nev:

dokumori's picture

@jun784 + @taka4nev: 検証と報告ありがとうございました。大変興味深かったです。

最近の変更

yohgaki's picture

substr()で切ってたのですね。それとは別にまだリリースされていないPHP 5.3ブランチでは文字が切れるバグの修正が行われています。参考までに。

[yohgaki@dev php-src-5.3]$ svn diff -r 317523 ext/mbstring/

Index: ext/mbstring/mbstring.c

--- ext/mbstring/mbstring.c (リビジョン 317523)
+++ ext/mbstring/mbstring.c (作業コピー)
@@ -3017,7 +3017,7 @@
/* make encoding list */
list = NULL;
size = 0;
- if (ZEND_NUM_ARGS() >= 2) {
+ if (ZEND_NUM_ARGS() >= 2 && !ZVAL_IS_NULL(encoding_list)) {
switch (Z_TYPE_P(encoding_list)) {
case IS_ARRAY:
if (!php_mb_parse_encoding_array(encoding_list, &list, &size, 0 TSRMLS_CC)) {