LOGIN ID Password Auto Login Register Now! Lost Password?
XUGJ Wiki

多言語化資料

XoopsをUTF-8化するとはどういうことか anchor.png

Page Top

表示をUTF-8でするということ anchor.png

日本語の場合、EUC-JPで表示できる文字はUTF-8でも表示できます

日本語のひらがな、漢字の一文字は
EUC-JP では 2バイト
UTF-8 では 3バイト
になります

まったく同じ日本語の内容でデータの量は最大1.5倍となり
内部の取り扱い量、データ送信の量も増えます
ほとんどわからないかもしれないですが、サーバーによっては目に見えて応答が遅くなるかもしれません

1.phpからの出力をUTF-8にする
 mbstring設定をどうするか?(後述)
2.ページHTMLヘッダーのmetaタグでのキャラクターセット指定をUTF-8にする

<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Page Top

内部の動作のキャラクターコードを変える必要があるのか? anchor.png

ソースなど内部の動作は標準のEUC-JPのままでUTF-8として出力するだけすることは可能ですが
UTF-8化は何のためにしてるのか?によりますが。必要です
UTF-8の特徴は、複数の言語を同時に表示できる点にあります

EUC-JPで表現できる、日本語や英語の書き込み記事、コメントだけのサイトなら
現時点では、UTF-8化する必要がありません

たとえば、中国語のコメントをEUC-JPのサイトにされた場合、すべての文字は表示できません
中国語の文字コードにはあるけど、EUC-JPの文字コードに変換できない文字というのがたくさんあるからです

UTF-8以外の通常ホームページによく使われるキャラクターコード
(フォントではなくてキャラクターコードですよ)
 日本語 EUC-JP,Shift_JIS
 中国語簡体字 GB2312(EUC-CN)
 中国語繁体字 BIG-5(EUC-TW)
 韓国語 EUC-KR
と国ごとに違うのはご存知ですよね

codelistzu01.gif
文字UTF-8Shift_JISEUC-JPGB2312BIG-5UCS-2
E4B89995B8CABAB1FBA4FE4E19
E4B89A00D2B504E1A
E4B89B00B4D404E1B
E4B89C00B6AB04E1C
E4B89D00CBBF04E1D
E4B89E8FE5BEE7D8A9A5E04E1E

この表の例のように、文字によりコード変換の
EUC-JP --> UTF8は、UTF-8のほうがサポートしている文字が多いのですべて可能
UTF8 --> EUC-JP は日本語、英語の文字以外はできないと思ったほうが良い

たとえば、コメント投稿された文字が
上記のEUC-JPに無い文字(中国語の文字)だとした場合
データベースの文字のキャラクターがEUC-JPの場合、
保存しようとしたときに変換できず、文字化け・抜けが発生することになります

これと同じ原因で起るのが、
標準japansesのEUC-JPの運用での、RSSの取得を中国語のサイトからした場合で
EUC-JPでの表示の内容が文字化け・抜けがでることになるのは
UTF-8の方が多くの文字に対応していて、EUC-JPとの変換は相互にできない文字を含んでいるからです

日本語だけなら文字の変換は相互に可能です
それはUTF-8の利点を利用していることにならず
バイト数が増えるという欠点だけにならないか、よく検討してください

Page Top

phpテキストソースのキャラクターコードを変える必要があるのか? anchor.png

phpテキストソースがなんのキャラクターコードを使用して書かれているかということ

japanese キャラクターコード:EUC-JP~

のままで、内部の動作だけUTF-8にすることも、可能だと思えますが
mbstringのマニュアルを読む限り、script_encodingの項を参照願います。

私はやったことがないのと
やはり、動作への影響を解読するのが難しくなることと
in-->内部-->out がすべてUTF-8であれば、
動作の途中でコード変換しないで動作します

だから、あらかじめphpテキストソースもUTF-8に変換しておくほうが分かりやすいと思います

EUC-JP,UTF-8,ISO-8859-1の半角英数字の16進での値は共通です

半角英字(アルファベット)、数字、一部記号の1バイト文字の

ASCII コードにあたる部分は共通の16進のコードです

だから、日本語のようなマルチバイトの文字が書かれていないテキストソースは
たとえば
EUC-JP -> UTF-8 と変換しても内容は変わりませんので、変換の必要がありません

半角英数字の部分は同じ(ASCIIのアルファベット範囲等)だけをUTF-7と表示するツールもありますが
UTF-7と判定されていても、phpテキストソースなら単純ASCII文字ばかりのはずで、
やはりEUC-JP と同じなので変換の必要がありません。

Page Top

各国語、言語、キャラクターコード、ローカライズ anchor.png

基本的に
Xoopsのコア部は、各国で使用できることが前提で作られています
各国語にあわせること(ローカライズ)が可能で
(同時に表示するということではありません)
この言語特有のファイルにより、各国の言語やキャラクターの違いを取り扱います
 

Xoops Cube 2.0.1x のxoops言語名 japanese

japanese
キャラクターコード:EUC-JP~
言葉 : 日本語、またはアルファベット(英字)、数字~
含まれる文字はEUC-JPキャラクターコードで表現できるもの

これをキャラクターコード UTF-8にして運用するということでしょう
ここでは例としてxoops言語名 japaneseutf として作成する場合を書きます

japaneseutf (japaneseは EUC-JP なのでjapneseutfと名前を変えたものを作成する)
キャラクターコード:UTF-8~
言葉 : 日本語、またはアルファベット(英字)、数字~
含まれる文字はUTF-8キャラクターコードで表現できるもの

というものを作成すればできます

Page Top

Xoopsの各国語言語はlanguageディレクトリにファイルされている anchor.png

Page Top

言語ファイルjapanese->japaneseutfコピーして作成 anchor.png

作業の概要としては

  1. 各japanese ディレクトリをディレクトリごとコピー、ディレクトリ名をjapaneseutfにする
  2. japaneseutfの中ファイルのソースのキャラクターコードをEUC-JPから UTF-8に変換する
  3. そのソース内に文字列 EUC-JP となっているところを UTF-8に訂正する
  4. その他訂正をする
Page Top

phpソースファイルのキャラクターコードをEUC-JPから UTF-8に変換する anchor.png

どのようなツールでも正しくキャラクターコードだけ変換してくれるものならばできます

  • テキストソースのキャラクターコードを一括して変換してくれるツールを利用する
  • EUC-JP,UTF-8をともに扱えるテキストエディターで一つ一つ開いて保存時にUTF-8コードを指定して置き換える
    など

注意:BOM(Byte Order Mark)の指定は無しで保存してください。
phpテキストソースの場合は、BOMはゴミとして表示に影響する場合があるので
強制的にBOMがついてしまうツールは使用しない方がよいでしょう。

BOMマークはそのテキストの先頭についています。
付いていてもエディタによっては表示しない機能のものがあります

注意:改行マークの扱いがツールやテキストエディタにより違います
変換後に末尾改行のゴミ取りが必要な場合があります

?>

[EOF]

と、末尾に余計な改行がついてしまう場合

?> [EOF]
または
?>
[EOF]

とエディタで修正する必要があります

Page Top

言語ファイルにEUC-JPと書かれているphpソースファイルの訂正箇所 anchor.png

EUC-JPと書かれているのは3ヶ所です。

  1. html/install/language/japanese/install.php line 177
define('_INSTALL_CHARSET','EUC-JP');
define('_INSTALL_CHARSET','UTF-8');

ここ(install/)は、インストールの時に使用するだけです
Xoopsのインストールをenglishでする場合は必要がありません

englishでXoopsのインストールをしても良いと思います
インストール後にXoops一般設定でjapaneseutfにすれば良いわけですから。
違いはランク名、グループ名、anonymous名など
あらかじめデータベースに設定される xoopsConfigの数個の値のみ
後で管理画面や、phpAdminで訂正してもできる

注意:Xoops cube 2.0.1xのインストーラーは
初期値をブラウザーの国種別で判定できた場合それを初期に表示をします
無ければenglish を使用します。

そのため、html/install/language/japanese/のディレクトリが存在すると
初期として japanese (EUC-JP)の言語のwelcome表示を出してしまう問題があります。
たとえば.htaccessなどでUTF-8にしている場合は、
japanese (EUC-JP)の言語だとかえって文字化けして表示されてしまうからです。

だから、japaneseutfなど他の言語名を初期インストールする場合は
html/install/language/japanese/のディレクトリは削除しておいてください

  1. html/language/japanese/global.php line 168
define('_CHARSET', 'EUC-JP');
define('_CHARSET', 'UTF-8');
  1. html/language/japanese/xoopsmailerlocal.php 全般
ここは、EUC-JP を ISO-2022-JP に変換して出力しているものなので
基本UTF-8に変換するが、例外の考慮も別途必要なので、後で説明

その他のモジュール内のlanguage

/html/modules/xoopsheadline/language/japanese/headlinerenderer.php line 33 
これは、モジュール内のことなので、Xoopsのコアのファイルではありません
xoopsheadlineを使わないで、他のモジュールを使うことをおすすめします
Page Top

メールの本文のエンコード anchor.png

  1. html/language/japanese/xoopsmailerlocal.php 全般
    メールの送信については
    UTF-8のまま送信するのであれば、コード変換の必要がないので
    キャラクターセットだけ指定すれば下記のようになる
<?php
class XoopsMailerLocal extends XoopsMailer {
  function XoopsMailerLocal(){
    $this->XoopsMailer();
    $this->charSet = 'UTF-8';
  }
}
?>

日本語の場合、使用者の環境がいろいろとあり
UTF-8一辺倒で良いわけではないです

特に、hotmail yahoo のウェブメールツールはUTF-8のメールは文字化けして判読できない(報告を受けたことがある)

また、UTF-8 のメールが読める携帯電話も最新のモデルでしか出来ない

つまり、メールは受けるユーザーしだいであり、UTF-8に対応しているとは限らない
添付の言語ファイルの中には、試行錯誤の結果のxoopsmailerlocal.php をいれているが

やはり、ユーザー情報として、受け取るメールアドレスとそのキャラクターコードを指定できるような
改造などの方が望ましいと思われます

Page Top

障害事例対応:IE(ブラウザー)での国言語種別の違いによる文字化け anchor.png

UTF-8で国言語種別 ja
HTMLのメタタグを

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-language" content="ja" />

としていると
日本語環境のWindowsで
日本語、中国語、韓国語を同時表示すると
中国語、韓国語は、文字化けします

この症状は、Mozilla系 Firefox NetScape Mozilla ではおきません

ブラウザーの使用するフォントの関係だと思うのですが
試しに

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-language" content="en" />

とすると、IEでも同時表示出来ます

  1. html/language/japanese/global.php line 169
define('_LANGCODE', 'ja');
define('_LANGCODE', 'en');

参考

Page Top

障害事例対応:ロケール指定の違いで動作の異なるphp関数 anchor.png

php関数にはロケール指定の違いに変数の動作や返り値のキャラクターコードが違うものがあります

 setlocale(LC_ALL, 'ja_JP' );
 print strftime('%x', mktime (0, 0, 0, 12, 10, 2003));
 // 見た目は2003□12?□□と表示される。
 setlocale(LC_ALL, 'ja_JP.UTF-8' );
 print strftime('%x', mktime (0, 0, 0, 12, 10, 2003));
 //setlocale関数 に、charset指定が可能らしい。
 // 2003年12月10日と表示される。(意図どおり)
  1. html/language/japanese/global.php
    追加
    @setlocale(LC_ALL, 'ja_JP.UTF-8')

参考

ロケールに依存する関数

  • setlocale -- ロケール情報をセットする
  • strcoll -- ロケールに基づく文字列比較
  • nl_langinfo -- 言語及びロケール情報を検索する
  • strftime -- ローカルな設定に基づきローカルな日付・時間をフォーマットします
  • gmstrftime -- ロケールの設定に基づきGMT/CUT 時刻/日付をフォーマットする
  • localeconv -- 数値に関するフォーマット情報を得る
  • money_format -- Formats a number as a currency string

影響すると書いてる関数

  • Pattern Syntax -- PCRE 正規表現の説明の中抜粋
  • XVI文字型(ctype)関数
  • ucfirst -- 文字列の最初の文字を大文字にする
  • strtolower -- 文字列を小文字にする
  • strtoupper -- 文字列を大文字にする
  • str_word_count
Page Top

障害事例:イベント通知メールのタイトルの文字化け anchor.png

新着メールはメールのエンコードをUTF-8で送信しているとします。
その新着メールはタイトルが中国語で送信されているとします。

症状:メールの件名が、中国語のときに一部の文字が必ず文字化けする
outlook express oultlook2000,2002 日本のパソコンで日本語のタイトルは文字化けしない
OS言語以外の、中国語言語のときに文字化けする

件名:[XOOPS UTF-8]“Forum”自?通知: 新帖(全文)

これはたぶんoutlookはタイトルの表示を中国語の文字をもたないフォントで表示されるからだと思う
どうしようもないです

メールは クライアントのメーラーしだいです

Page Top

UTF-8 用の.htaccessの例 anchor.png

特に書く必要もないと思いますが

php_value mbstring.language uni
php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_input auto
php_value mbstring.http_output pass
php_flag mbstring.encoding_translation ON
php_value mbstring.detect_order ASCII,JIS,UTF-8,EUC-JP,SJIS,EUC-CN,BIG-5,EUC-KR
php_value mbstring.substitute_character none
php_value output_handler none

補足説明

php_value mbstring.language Japanese

php_value mbstring.language uni

の違いは不明

detect_orderをautoとしていない理由は

php_value mbstring.detect_order ASCII,JIS,UTF-8,EUC-JP,SJIS,EUC-CN,BIG-5,EUC-KR

順番に確信があるわけではありません
autoだと、EUC-KRが含まれていないため。
トラックバックなどで必ずといっていいほど韓国語が文字化けするからです

Page Top

モジュールのUTF-8対応 anchor.png

特別なことはないのですが
実際に使用するためにはいろいろです
言語ファイルだけ変換してjapanese -> japneseutfとすれば良いものもあるのですが
基本は同じ要領で変換しなくても良いところはしない
EUC-JPから変換しているところはUTF-8と直す

日本語環境で使用されているものには、
EUC-JPの固定の指定がソースロジック内に書かれているものが多いです
提供者がUTF-8での使用環境まで想定できない、する暇が無いなど
利用者が自分でなんとかしないといけないので
どうしても使用できるものが限られます

サーチ系などロジックは、文字をバイト表記で正規表現を指定しているものもありますから
そういうものは、コード表とにらめっこして訂正しないと使用できません

Page Top

MySQL anchor.png

MySQL 3.xの default のcharset は ujis でしている
通常の日本語が動いているサーバーなら動作するはずです

ただしMySQL 4.1以降では キャラクタ-セットの指定などが必要になります

mysql_query("SET NAMES utf8", $this->conn);
Xoops2.0.1xはMySQL4.1以降は、まだサポート外です

参考
MySQL 4.1 マニュアルの説明

参考例:Xoops Cube 2.1RC
html/install/language/japaneseutf/charset_mysql.php

<?php
   $this->db->queryF("/*!41000 SET NAMES utf8 */");
   $this->db->queryF("/*!41000 SET SESSION character_set_database=utf8 */");
   $this->db->queryF("/*!41000 SET SESSION character_set_server=utf8 */");
   $this->db->queryF("/*!41000 SET SESSION collation_connection=utf8_unicode_ci */");
   $this->db->queryF("/*!41000 SET SESSION collation_database=utf8_unicode_ci */");
   $this->db->queryF("/*!41000 SET SESSION collation_server=utf8_unicode_ci */");
?>

html/modules/legacy/language/japaneseutf/charset_mysql.php

<?php
   $GLOBALS['xoopsDB']->queryF("/*!41000 SET NAMES utf8 */");
   $GLOBALS['xoopsDB']->queryF("/*!41000 SET SESSION character_set_database=utf8 */");
   $GLOBALS['xoopsDB']->queryF("/*!41000 SET SESSION character_set_server=utf8 */");
   $GLOBALS['xoopsDB']->queryF("/*!41000 SET SESSION collation_connection=utf8_unicode_ci */");
   $GLOBALS['xoopsDB']->queryF("/*!41000 SET SESSION collation_database=utf8_unicode_ci */");
   $GLOBALS['xoopsDB']->queryF("/*!41000 SET SESSION collation_server=utf8_unicode_ci */");
?>

トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 16725, today: 1, yesterday: 0
初版日時: 2007-02-18 (日) 21:55:56
最終更新: 2014-01-13 (月) 22:06:02 (JST) (1261d) by ゲスト
Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities