特定の日本語表示に対する文字化け - PHPプロ!Q&A掲示板

2616

  • 0P

特定の日本語表示に対する文字化け

質問日時 / 2010年3月11日 01:02    回答数 / 6件

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

キーワード / 文字コード    SJIS    文字化け   

表題の件につきまして、ご質問させて頂きます。

PHPファイルがSJISでコーディングされている為、特定の日本語を使用すると、文字化けが発生してしまします。

■環境
 Linux
  Apache
  PHP4
  Postgres Ver7

諸事情により、PHPのバージョンを上げる事ができず、又、ソースコードの文字コードをUTF-8に変更する事もが難しい為、良い対処方が無いか現在探しております。

情報をお持ちの方がおりましたら、何卒ご教授の程よろしくお願い致します。

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



ツリー一覧

┗A01shimix「特定の日本語」はどういう文字で、どういうケースで
 ┗A01-1takeHo情報が不足しておりました。 文字化け対象となる文
  ┗A01-1-1shimix>文字化け対象となる文字は「表」や「能」です。
   ┗A01-1-1-1takeHoshimixさん 有り難うございます。 今回のライブ
    ┗A01-1-1-1-1shimix>自動的にエスケープを入れる処理を行いたいと思いま
     ┗A01-1-1-1-1-1takeHoshimixさん 情報有難うございます。 分かりやす

回答一覧

並び替え:

A01
answerershimix [3月11日 07:58] (最終編集:3月11日 09:34)

「特定の日本語」はどういう文字で、どういうケースで発生するんでしょうか?

magic_quotes_gpcがonの環境でフォームからの入力が化けるとかであれば、基本的な話ですし・・

  http://www.shtml.jp/mojibake/sjis_cgi.html#php

リテラルで書いたものが化けるとか、データベースからの表示で化けるとか・・そういう状況を教えてください。

#いずれにしても「特定の日本語」のコード(16進)を調べればわかりそうですけどね。

この意見に回答する

ツリーへ TOPへ

A01-1
replyertakeHo [3月11日 16:00] (最終編集:3月11日 16:02)

情報が不足しておりました。

文字化け対象となる文字は「表」や「能」です。

HTMLタグの生成ライブラリを開発中に、この問題が発生しました。
  1. ※省略
  2.  
  3. class Html {
  4.  
  5.   function span( $data, $option, $flg = false ) {
  6.   
  7.     if ( $flg == true ) {
  8.  
  9.       return sprintf( '<span %s>%s</span>', $this->css( $option ), $data );
  10.     }
  11.  
  12.      // css()はスタイルシートのメゾット
  13.      echo  sprintf( '<span %s>%s</span>', $this->css( $option ), $data );
  14.   }
  15.  
  16. }
  17. $Html = new Html();
  18.  
  19. ?>
  20.  
  21. ※省略
  22.  
  23. <? $Html->span( '新機能'array( 'color' => '#ff0000' ) )?>
  24.  
  25. ※省略

御手数お掛けしますが、何卒宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [3月11日 16:40]

>文字化け対象となる文字は「表」や「能」です。

であれば、前のレスで書いたURLのとおり「5c」が含まれているんですよね。sjisだと、print '新機能'; と書いただけでParse Errorになります。

  1. <? $Html->span( '新機能\'array'color' => '#ff0000' ) ); ?>
ではどうですか?


正直「ソースがSJIS限定」というのはキツイですね。入出力はまだしもソースのエンコーディングは何でもかまわないだろうと思うのですが・・。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyertakeHo [3月11日 18:50] (最終編集:3月11日 18:51)

shimixさん

有り難うございます。

今回のライブラリ作成に際して、「Parse Error」の対象になる文字に関しては自動的にエスケープを入れる処理を行いたいと思いますが、知識・技術不足の為、その要領に現在悩んでおります。

単純に
  1. <?php
  2.  
  3. $encode_data = urlencode( '新機能' );
  4.  
  5. $decode_data = urlencode( str_replace( '5c''5c%5c'$encode_data ) );
  6.  
  7. echo $decode_data;
  8.  
  9. ?>
では、出来ませんでした。

正規表現で、'5c'を上手く操作する方法でも現在調べております。

度々御手数お掛けして恐縮ですが、良い処理方法等ありましたら、ご教授の程、宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyershimix [3月11日 19:30]

>自動的にエスケープを入れる処理を行いたいと思いますが、

Parseできないものは、それ以降どうやっても無理です。そもそもリテラルで'新機能'とか'一覧表'と書いた時点で終端の単引用符が認識されないのですから。それが「ソースがマルチバイト非対応」の言語でSJISが推奨されない最大要因です。

#数自体は多くない(前述のサイトの一覧で40個)ので慣れた方だと覚えてしまっていて、
#自動的に「\」を付加してtypeしちゃうみたいですが(汗

リテラルをあちこちに書かなくて済むように、まとめてdefineするなどの工夫をした方がいいと思います。エラーになったり文字化けしてくれればすぐにわかりますが、思わぬところで(引数の順番がずれるとか)バグを生む可能性もありますので。


(蛇足)
もしスクリプトで処理出来たとしても(前述のとおり処理出来ませんが)'5c'はダメですね。書くとすれば0x5cです。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyertakeHo [3月14日 21:57]

shimixさん

情報有難うございます。

分かりやすい説明で大変助かりました。

対処法については、現在未だ検討中ですが、今後の運営を考慮してPHPファイルの文字コードの見直しについての重要さが増した次第です。

今まで、何とかSJISでやりくりしていた事を考えると、その為の労力に価値を付けるのが難しいだと個人的にネガティブだと思い込んでしまうところです。

本当に有難う御座いました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

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

>>続きを読む

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

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