小テスト、レッスンの質問インポートの文字コード

小テスト、レッスンの質問インポートの文字コード

- Tatsuya Aoyagi の投稿
返信数: 11
はじめまして。

小テスト、レッスンにgift形式等で質問をインポートする際、
euc-jpのファイル以外は文字化けしますよね。

そこで、mod/quiz/format.phpとmod/lesson/format.phpを
添付ファイルのように修正して、
shift-jisでもutf-8でもjisでも大丈夫なようにしてみました。
mbstringの関数を呼んでいるので
php.iniで
extension=php_mbstring.dll
を有効にする必要があります。

日本語のサイトであるかどうかを
default-charsetがeuc-jpかどうかで判断していますが、
もっと適切な方法があるのでしょうか?

Tatsuya Aoyagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahiro Kagoya の投稿

はじめまして。

青柳さんにも柏木さんも、みなさん、すごいですね。サクサクとコード化されて。私は、コメントしてるだけで申し訳ないですが...

ちょうど、文字コード変換の話題で、直前のスレッドが続いているところです。

それで、日本語のサイトの判断ですが、lib/moodlelib.phpのcurrent_language()関数が 'ja' を返すかどうかで、判断されるというのでいかがでしょう。

それと、mbstring以外にjcode.phpを使う利用する...というのも、直前のスレッドで話題になっています。ご参考にされたらいかがかと思います。

Tatsuya Aoyagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahito Kashiwagi の投稿

青柳さんこんにちわ。柏木です。

ちょうど、
http://moodle.org/mod/forum/discuss.php?d=11711
こちらのスレッドで日本語化の話題を扱っています。

青柳さんの提供していただいたコードを、

  global $CFG;
  $currlang = current_language();
  if (file_exists("$CFG->dirroot/lang/$currlang/lib/langlib.php")) {
   include_once("$CFG->dirroot/lang/$currlang/lib/langlib.php");
   $lang_code = rtn_lang_code();
   if (extension_loaded('mbstring')) {
    $lang_conv = 'mb_convert_encoding';
   } else {
    $lang_conv = 'lang_convert_encoding';
   }
   $i = 0;
   while ($filearray[$i]) {
    $filearray[$i] = $lang_conv($filearray[$i], '$lang_code');
    $i++;
   }
  }

のように、すると、もう一つのスレッドとの統一性が取れ、日本語ライブラリに取り込めると思うのですがいかがでしょうか?
※今、急いで上記を書いたので実行検証してませんが^^;

上記を実行するには、
http://www.supertak.com/down/sample5.htm
にあるlanglib112.lzhが必要です。

Takahito Kashiwagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahito Kashiwagi の投稿
ごめんなさい。ドタバタしてて、現在公開してるlanglib112.phpが古いです。後ほど更新しておきます。さらに、上記のそのままでは動かないようです^^; なんとなくな仕様はご理解いただけるかとは思いますが。アドバイス程度に受け止めてください。langlib114.lzhを後ほど公開しておきます。
Tatsuya Aoyagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahito Kashiwagi の投稿

        global $CFG;
        $currlang = 'ja';
        if (file_exists("$CFG->dirroot/lang/$currlang/lib/langlib.php")) {
            include_once("$CFG->dirroot/lang/$currlang/lib/langlib.php");
            $lang_code = rtn_lang_code();
            if (extension_loaded('mbstring')) {
                $lang_conv = 'mb_convert_encoding';
            } else {
                $lang_conv = 'lang_convert_encoding';
            }
            $i = 0;
            while ($filearray[$i]) {
                $filearray[$i] = $lang_conv($filearray[$i], $lang_code, "auto");
                $i++;
            }
        }

で、動作しました。
※この位置からでは、current_language()が呼び出せないので、暫定的に、'ja'にしてあります。もしよろしければ、上記パッチも、
http://www.supertak.com/down/sample5.htm
で公開させていただけますか?

Takahito Kashiwagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Tatsuya Aoyagi の投稿

> もしよろしければ、上記パッチも、
> http://www.supertak.com/down/sample5.htm
> で公開させていただけますか?

はい。OKです。

上記のパッチは、
giftファイルを書く先生に
euc-jpという言葉を説明しなくてもよいようにしたいと思い、
「とりあえず動けばいいや」という程度で修正したのですが、
きちんとしたパッチにしようと思うと
current_languageとサイトのcharsetの関係が
よくわからなくなりました。

例えば、サイトがutf-8で構成されていて、
ユーザがjaを選択している場合には、
euc-jpに変換するわけにはいかないですよね。

きちんとしたパッチにしようと思うと、
langがjaだからといって、
変換すべきcharsetが一意に決まるわけではない気がします。

langlib112.lzhは
langからcharsetが一意に決まるという前提で
書いてあるような気がしますが、
これでよいのでしょうか?

$CFGにsite_charsetという設定が必要ではないでしょうか?

あるいはdefault-charsetで代用でしょうか?

    ***

ところで、もう修正されているかもしれませんが、
langlib112.lzhのlanglib.phpの3行目に
typoを見つけたのでお知らせします。

// Define Janguage Code

Janguage→Language

Tatsuya Aoyagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahito Kashiwagi の投稿

ありがとうございます。指摘箇所を修正した後、公開させていただきます。別スレにあるカレンダーのポップアップの件は日付表示の問題なのですが、前回までの修正で回避できています。これでさらに日本語対応が進みそうです。現在までに対応できた内容は・・・。

GD2の日本語表示への対応。 メールの文字コードをiso-2202-jpに統一。 日付表示の日本語表示への対応。 EXCELワークシートの日本語表示への対応。 インポートファイルの日本語表示への対応。

となりました。

charsetの問題ですが、様々な使用環境やPHP.iniの設定が考えられるため、site_charsetがいつも予想しているものを返してくれないような気がしてます。現在は仕方がないので、langlib.phpの中でeuc-jpを返すような仕組みを取ろうと思ってます。サイトがutf-8で公開されているような場合には、これをutf-8に書き換える必要があります。

何か良い案があれば、是非教えてください。

また、別スレでも書きましたが、PHPを実は良く知りません。勉強しようとは思いながらも、今までに触れた事がありませんでした。現在、勉強しつつ作成しているので、ソースにも見苦しい点があると思います。なぜlanglib.phpというファイルを持ちながらソースを一つにまとめてないのか?ソースが回りくどいのか?未だfunctionやclassの勉強中だからです^^;;PHP特有の変数の受け渡しがまだよく理解できてません。勉強が済み次第、まとめる予定です(気が長すぎますかね?)。ですので、PHPに詳しい方からの指摘は大歓迎です。

Tatsuya Aoyagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahito Kashiwagi の投稿

> langがjaだからといって、
> 変換すべきcharsetが一意に決まるわけではない気がします。

そうなんですよね。現在は、日本語環境をja一つでまとめられてしまってますが、本来は、euc、sjis、jisは全く別の言語環境と言えるので、ja-euc、ja-jis、ja-sjis、ja-utf8などとしていただけるとありがたいのですが。これは本家に言わないとだめでしょうね。

Takahito Kashiwagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Timothy Takemoto の投稿

ずっと見ているけれど、何を本家に言えればよいかよく分かりませんので、まだ何も伝えていませんが、とりあえず、今のjaをja_eucに買えてもらってもらいましょうか?

soushitemimasu.

Timothy Takemoto への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Tatsuya Aoyagi の投稿

どうするのがよいのか、よくわかりませんが、
エンドユーザがエンコーディングまで
選択するのは変な気がするので、
エンドユーザが選択する言語としては、
jaもしくはja_JPでしょうね。

それとは別に、サイトの設定として、
サイト内のエンコーディングを
euc-jpにするか
utf-8にするかの選択が
あるのでしょうか。

langの下のフォルダーは、
どうするのかなぁ。

Linuxの標準的なロケール名
http://www.linux.or.jp/JF/JFdocs/Japanese-Locale-Policy/
に合わせて
ja_JP.eucJP

ja_JP.UTF-8
にするのかなぁ?

Tatsuya Aoyagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahito Kashiwagi の投稿

Moodleでは管理者がどの言語を使用可能にし表示するか決めることができるので、例えば、構築環境がEUCなのであれば、ja-eucだけONでその他はOFFにできます。さすれば、エンドユーザはおのずと、JPならEUCしか選択できません。

むろん、管理者がUTF-8フォーマットも用意しているのであれば、今度は、jp-utf8もONにすれば、エンドユーザは、EUCかUTF8の選択ができます(できたからなんだという事になりますが^^;)。各日本語化DOCを現在はEUCで構築されてますが、今後はUFT8なども加わるかもしれません。その際に、/lang/ja/ しかないとなると、このフォーマットで記載されたDOCファイルを置く場所がありません。これが、/lang/ja-euc/  /lang/ja-uft8/ となっていれば、UTFに限らず、sjisもjisも別途に保管しておけると思います。

さらに、利点として、languageの選択を見るだけで、複雑な事を考えなくても、容易にして、現在表示に用いている日本語コードを知ることができます。

と、考えたりしてみたのですが、少々考えが浅いですかね?^^;

ただ、ja-eucという、この記載方法が一般的なのか、異なるのか、一般的に定義された記載方法が他にあるのかなどに関しての専門的な事は私には分かりません^^;

Takahito Kashiwagi への返信

Re: 小テスト、レッスンの質問インポートの文字コード

- Takahiro Kagoya の投稿

私としては、現在の構成、つまりEUCでサイトを構成し、クライアントととのファイルのやり取りがある部分についてはSJISにするとか、メールについてはiso-2022-JPにするというのでまず日本語化がきちんとされるのがありがたいです。 MySQL等のデータベースとの文字コードの関係もありますし。
もちろん、utf8のためのフォルダ構成を考えておく必要性は無視できませんが。