機種依存文字の文字化けについて - PHPプロ!Q&A掲示板

446

  • 0P

機種依存文字の文字化けについて

質問日時 / 2007年4月8日 22:13    回答数 / 5件

Questioner:  gonkosan  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

Oracleから取得した文字列をPHPで表示しています。

日本語自体は文字化けしていないのですが、
機種依存文字といわれる”はしごだか”や”たつさき”、
丸囲み数字が文字化けしています。
どのようにすればよいのでしょうか?

OracleからPDO接続で文字列を取得しているので、
取得後にmb_convert_encoding($str, "EUC", "SJIS");としても
なおりませんでした。

環境は以下です。
Oracle10.2.0
php-5.1.4
apache2.0.58

元々下記の環境では文字化けが発生しなかったので、
PHP.INI等の設定を同じようにしてみたのですが、解消されませんでした。
Oracle9.2.0
php-4.3.2
apache1.3.27

===========
PHP.INIの設定は以下です。
output_buffering=On
output_handler=mb_output_handler
default_charset=Shift_JIS
mbstring.language=Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input=auto
mbstring.http_output = SJIS
mbstring.substitute_character=none;
mbstring.encoding_translation=On
===========

よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01pricelessです。 スクリプトの文字コードはどうな
┣A02weekendphpmb_convert_encoding($str, "EUC", "SJIS"); を利用
┃┗A02-1weekendphp書いてから、実際の挙動が気になるので、いくつかのパ
┗A03dozoyousanPHPの設定やマルチバイト関数の引数で使っている "EU
 ┗A03-1gonkosan頂きました回答を参考にやってみました。 PHP.ini

回答一覧

並び替え:

A01 参考になった
answerer [4月8日 23:09] (最終編集:4月8日 23:11)

pricelessです。

スクリプトの文字コードはどうなっていますか?
私のところではgonkosanさんと同じphp.iniの設定内容で、
EUCで記述した下記のスクリプトが正常に動きました。
「1」にはいわゆる「はしごたか」を、「2」にはいわゆる「たつさき」を、
そして「3」には「丸の中に1」の丸付き数字を
書きました。

<?php
print '1';
print '2';
print '3';
?>

この意見に回答する

ツリーへ TOPへ

A02 満足
answererweekendphp [4月9日 16:10] (最終編集:4月9日 16:31)

mb_convert_encoding($str, "EUC", "SJIS");
を利用する場合、SJISでは、JIS X0201:1997 / JIS X0208:1997 の範囲の文字が
サポートされると記載があります。
http://www.php.net/manual/ja/ref.mbstring.php

上記規格にはたしか「まるいち」などの特殊文字類は定義されていないため
変換がされないと思われます。

また、EUCについても、サポート範囲が
US-ASCII / JIS X0201:1997 (半角カナの部分) / JIS X0208:1990 / JIS X0212:1990
となっている模様ですが、これにも「まるいち」は含まれていなかったように
記憶しています。

なお、「まるいち」などは JIS X0213:2004 にて、
「はしごだか」や「たちざき」はJIS X0212:1990とJIS X0213:2004にて
それぞれ定義されていたはずです。

「まるいち」はSJISでもEUCでも拡張文字セットにあたるため、
対応していない模様。

「はしごだか」や「たちざき」はEUCでは登録がありそうですが、
SJISなどでは対応していない模様。

ちなみに、Unicodeでは、「まるいち」はBMP面に登録されていると思いますが、
UTF-8ではBMP面は使えない模様。
「はしごだか」「たちざき」は、JIS X0212の漢字は対応していたと思うので
使えるような気がします。

よって、内部的に無理やり変換させることは可能だとは思いますが、
文字コードを変換したい場合は、変換テーブルを用意して
ゴリゴリやるしかないかと思われます。

と、書きましたが、文字コードに関してはいろいろ複雑な歴史や事情があるので
上記の記述に誤りがある可能性があるので、正式には規格を調べてみてください。

参考まで。

この意見に回答する

ツリーへ TOPへ

A02-1 満足
replyerweekendphp [4月9日 17:33]

書いてから、実際の挙動が気になるので、いくつかのパターンで
実際に検証してみました。

PHP4.3.2(Linux系)とPHP5.0.5(Win)で行いました。

テスト条件:WinSJISで書いたテキストの文字コードを変換する
テスト文字:
「○1」「○20」「はしごだか」「たちざき」「iii」「III」「(株)」「No.」
「ルート記号(算術)」「否定記号(算術)」
テスト結果:
mb_convert_encoding($test, "euc", "sjis"); 
→「はしごだか」「たちざき」「iii」「(株)」が変換不可

mb_convert_encoding($test, "euc", "sjis-win"); // ①⑳﨑髙ⅲⅢ
→「○1」「○20」「はしごだか」「たちざき」「iii」「III」が変換不可

mb_convert_encoding($test, "eucjp-win", "sjis-win"); // 﨑髙ⅲ
→「はしごだか」「たちざき」「iii」が変換不可

mb_convert_encoding($test, "UTF-8", "sjis"); // ①⑳﨑髙ⅲⅢ㈱№
→「○1」「○20」「はしごだか」「たちざき」「iii」「III」「(株)」「No.」が変換不可

mb_convert_encoding($test, "UTF-8", "sjis-win");
→問題なくすべてが変換できました。

上記のような結果になりました。
参考まで。

この意見に回答する

ツリーへ TOPへ

A03 満足
answererdozoyousan [4月9日 17:04] (最終編集:4月9日 17:05)

PHPの設定やマルチバイト関数の引数で使っている
"EUC-JP"を"eucjp-win"、
"SJIS"を"sjis-win"
にしてみたときはどうなりますか?

この意見に回答する

ツリーへ TOPへ

A03-1
replyergonkosan [4月11日 22:29]

頂きました回答を参考にやってみました。

PHP.iniの設定をeucjp-win,sjis-winにし、
ApacheのenvvarsをJA16SJISにして、
PDOでのデータ取得後に、
mb_convert_encoding($test, "eucjp-win", "sjis-win");
としたところ、文字化けがなくなりました。

回答いただきました皆様ありがとうございました。
非常に助かりました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)