mb_convert_encoding()の挙動について質問

このQ&Aのポイント
  • 質問文章からセンセーショナルなタイトルを30文字前後で生成します。
  • 就職活動のために内定を頂いた会社から、初心者だけど独学の実力を見るための課題が出されました。問題は、uibuntu Linuxでバッチプログラムを作成している際に、文字コードをEUC-JPでcsvに出力する際に文字コードが変換されていないことです。質問者はmb_convert_encoding()関数を使用して文字コードを変換しましたが、表示される文字コードはASCIIでした。php.iniの設定も確認しましたが、問題は解決しません。この問題についてアドバイスをいただけないでしょうか。
  • 初心者の質問:mb_convert_encoding()関数を使用して文字コードを変換したが、表示される文字コードがASCIIになってしまう問題が発生しています。php.iniの設定も確認しましたが、解決できません。どのように対処すれば良いかアドバイスをいただけないでしょうか?
回答を見る
  • ベストアンサー

mb_conver_encoding()の挙動

就職活動の為、内定を頂いた会社から 初心者だけど、独学の実力を見るうえで課題を出されました。 あるuibuntu Linuxでバッチプログラムを作っています。 大体の挙動は問題ないのですが。 文字コードをEUC-JPでcsvに出力する点で 文字コードが変換されていないようなので、質問させてください $this->msg = mb_convert_encoding($this->msg,'EUC-JP','auto'); と記述して、出力した後、 kkc -c コマンドで出力ファイルの文字コード取得したところ ASCIIと表示されました。 php.iniは mbstring.detect_order = auto default_charset = "EUC-JP" mbstring.internal_encoding = EUC-JP mbstring.http_output = EUC-JP お手数ですが、ご教授願いないでしょうか。

  • prr4e
  • お礼率48% (66/136)
  • PHP
  • 回答数5
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

kkc -c じゃなくて nkf --guess で調べてみては?

prr4e
質問者

補足

ご親切に対応して下さって有難う御座います。 言われた通り、nkf --guess file名で調べてもやはりASCIIと表示されます。 mb_convertの使い方にLinuxもwinも関係ないとは思ってはいるのですが、 関係があrったりするのでしょうか。 回答に再々の質問で申し訳ありませんが、宜しくお願い致します。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

>autoをASCIIに変えてもダメと言う事ですよね。 ごめんなさい、説明がわるかったのかもしれません。 「ASCII」のファイルはSHIFT-JISでもEUCでもUTF8でもなく、 ただの「ASCIIテキスト」だということです。 文字コードがいろいろ必要なのは、マルチバイト文字があるからです マルチバイト文字を含んでいないファイルは、変換の必要もないし 変換することは理論上できません。 #4の補足は改行コードだけ変換する可能性があることを提示しただけで 理解できないのであれば忘れてもらって結構です。 ちなみに前回の書き込みは完全に私の勘違いで、LF→CR+LFではなく CR+LF→LFですね。失礼しました。

prr4e
質問者

補足

ご親切に再度回答をして下さって有難う御座います。 ただのASCIIだとダメだと、今回の件で本当に勉強になりました。 仕様としては改行コードはLFでした。 mb_convert_encodingで変換出来ないのであれば、 改行コードも一緒だと思っていましたが、 改行コードだけは可能なんですね。 本当にありがとう御座います。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

まぁ最初からASCIIならしょうがないですね・・・ ちなみにEUCの環境は改行コードがLFだと思います SHIFT-JISやUTF8を想定しているなら絶対ではないですが往々にして CR+LFに変換の必要があるかもしれません。 よくよく仕様の確認が必要です。

prr4e
質問者

補足

ご回答有難う御座います。 php.iniのdefault_chara等は全てEUC-JPに変えてやってみましたが、 やはりダメでした。 元々ASCIIだと mb_convert_encodeing($str,"EUC-JP","aut"); のautoをASCIIに変えてもダメと言う事ですよね。 元データの保存形式をEUC-JPに変えてもデータがシングルバイトなので、変換は効かないと言う事だと前の方の回答で認識してしまったのですが・・・ 以上、宜しくお願い致します。

  • t140
  • ベストアンサー率39% (59/150)
回答No.3

元データがホントにASCIIコードのみならマルチバイトコードを含んでないので 日本語EUCに変換できなくて当然じゃないでしょうか? 元データにマルチバイトコードが含まれてることを確認できていますか?

prr4e
質問者

補足

ご親切に有難う御座います。 元データは↓のアクセスログを 2011/04/26 00:00:00 /path/url/top.html 245 のアクセス集計を出力した(↓)内容になります。 00:00 0 0 0 245 どちらもマルチバイトのデータは含んでいないのです。 尚、元データを nkf --guess で調べたら やはりASCIIでした。 元データが日付とシングルバイトのデータだと 変換されないとは知りませんでした。 教えて下さってありがとう御座います。

  • bakaok
  • ベストアンサー率22% (33/148)
回答No.1

>独学の実力を見るうえで課題を出されました。 それ人自分でやらないと意味ないだろ。 人に聞いてどうする? こんな事が解けないなら内定辞退しろよ。 (独学でできると嘘をついて貰った内定なんて入社したらあっという間にボロが出てどうせ使えない奴の烙印を押されて退社することになるぞ)

関連するQ&A

  • mb_convert_encoding で?になる。

    $old = "名前"; $new = mb_convert_encoding($old,"EUC-JP","auto"); echo "$new"; 上のスクリプトを実行すると、’名前’が半角の’?’に なるんですよー。 何ででしょうか? ページもEUC-JPだし、phpもEUCです。 PHP Version 4.3.10で、php.iniの mbstring.internal_encodingはEUC-JPです。 OSは、テストなので自分のPCのw2kです。 mb_convert_encodingが実験的だからなのでしょうか? 他にも同じようになる物があるのでしょうか? 対処方法はあるのでしょうか?

    • ベストアンサー
    • PHP
  • mb_convert_encoding で 一部の文字が変換できない。

    こんにちは、初めて質問させていただきます。 PHPでテキストファイルに保存されたEUC-JPの文字列情報を UTF-8で表示しようとしています。 第一水準、第二水準程度の日本語は問題なく変換ができてるのですが、 「(7)」や「VII」などの特殊な記号文字が変換できないようです。 これは mb_convert_encoding の仕様なのでしょうか? ご存知でしたらご教授お願いいたします。 【ソース】 $buffer = "マル4→(4) ギリシャ4→IV 郵便番号→〒 株式会社→(株) \n"; echo mb_convert_encoding($buffer, "utf-8", "euc-jp"); 【出力結果】 マル4→? ギリシャ4→? 郵便番号→〒 株式会社→? 【環境情報】 Linux (OS、バージョン詳しくは分かりません。) PHP Version 4.3.9 mbstring.detect_order      no value mbstring.encoding_translation  Off mbstring.func_overload      0 mbstring.http_input       pass mbstring.http_output       pass mbstring.internal_encoding    EUC-JP mbstring.language        Japanese mbstring.script_encoding     no value mbstring.substitute_character  no value (Local Value、Master Value 共に同値です。)

    • ベストアンサー
    • PHP
  • PHP関数mb_send_mailで送信すると件名が文字化けしてしまいます。

    PHP関数mb_send_mailでメールの送信しているのですが、件名だけが文字化けしてしまいます。 Windows2000Server+IIS ■PHPソース mb_send_mail($strMail,mb_convert_encoding("あいうえお","JIS","auto"),mb_convert_encoding("かきくけこ","JIS","auto"),$header); ■PHP.INI設定 extension=php_mbstring.dll SMTP = localhost smtp_port = 25 sendmail_from = sample@sample.jp mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none; ■文字化けするSubject Subject: =?US-ASCII?B?GyRCJCIkJCQmJCgkKhsoQg==?= このPHPソースを別のレンタルサーバにいれ、送信すると文字化けせずに届きます。 なぜか、受信メールの文字コードがUS-ASCIIになっています。どうすればいいのでしょう? 誰かたすけてくださいーー

  • php.iniを変更したのにUFT-8が文字化け

    こんにちは。教えて下さい。 Movable TypeをUTF-8で運営しようと思いましたが、使用中のサーバーのphpの文字コードがEUC-JPでした。 サーバーに問い合わせたところ、php.iniを編集するだけで文字コード変更できます、とのこと。 そこで、php.iniの mbstring.language = Japanese mbstring.encoding_translation = On mbstring.http_input = auto mbstring.http_output = EUC-JP mbstring.internal_encoding = EUC-JP mbstring.detect_order = auto mbstring.substitute_character = none; を mbstring.language = neutral mbstring.encoding_translation = On mbstring.http_input = auto mbstring.http_output = UTF-8 mbstring.internal_encoding = UTF-8 mbstring.detect_order = auto mbstring.substitute_character = none; にしてみました。 当方初心者で、php.iniは初めていじりました。 EUC-JPとあった箇所またはJapaneseとあった箇所を変更したのみです。 また、Movable Typeのmt-config.cgiで 文字コードをEUC-JPからUTF-8に変更。 Movable Typeの文字コード関連の変更はこのファイルのみですのでこれで大丈夫・・・。 そう思ったのですが、Movable Typeが文字化け・・・。 php.iniの設定が間違っているのでしょうか? 助けてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • mb_detect_encoding()関数について

    かなり初歩的な質問かもしれませんが、とあるサイトを参考に、以下のスクリプトを作って文字コードをEUC、 改行コードをLFにして保存し、実行しました。 <?php $str="PHP練習"; print mb_detect_encoding($str); ?> これを実行した結果は、 UTF-8でした。 てっきり保存した文字コードが出力されると思ったんですが違いました。ためしに今度は「$str="PHP練習";」の部分を「$str="PHP";」に してみたらASCIIと出力されました。 さらに今度は「mb_detect_encoding($str);」の部分を、 「mb_detect_encoding($str,"UTF-8");」にして実行したら、 UTF-8と出力されました。 「mb_detect_encoding($str,"SJIS");」にして実行したら、 SJISと出力されました。 あといろいろ$strの中の文字を変えたりしてみましたが、 たまに何も出力されないときもありました。 サイトの説明を見たら、「mb_detect_encoding()関数は、文字列のエンコーディング形式を検出します」と書いてありました。 この「文字列のエンコーディング形式」というのは何によって決まるのでしょうか?

    • 締切済み
    • PHP
  • PHP 入力値 文字化け

    phpでFormで入力した値(日本語)が文字化けしてしまいます。 環境は WinXp pro apache2.0.59 php 4.4.7 php.iniのおもな設定ですが、 mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none; ブラウザからすべてShiftJisで入力されているのですが、 それがうまく EUC-JPに内部エンコードされていません。 mb_convert_encording($str,"EUC-JP","auto")をスクリプト内で 記述するとうまく表示されますが、なんとか設定で文字化けしないよう にできないでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • phpでの書き出しでの文字化け解消について

    お世話になります。 SJISを使いたく、php.iniを次のように設定しましたが、まったく文字が読めない状態で書き出されてしまいます。問題点をお教えいただけないでしょうか。 default_charset="Shift_JIS" mbstring.language=Japanese mbstring.internal_encoding=EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation=On mbstring.detect_order=auto また、内部円コーディングのmbstring.internal_encoding=EUC-JP はこれでよいのでしょうか。SJISを使うなら、SJISのほうがよいのでしょうか。 どなたか、お助けいただけないでしょうか。 どうか、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mb_convert_encoding() エラー

    http://www18.tok2.com/home/koumori27/xml/pxml/pxml2.htmlのxmlpaser_sample1.php3を自分のパソコンで試したら、Fatal error: Call to undefined function: mb_convert_encoding() in c:\php\xmlpaser_sample1.php on line 99と出ました。 http://www.php.net/manual/ja/ref.mbstring.php#ini.mbstring.languageに書いてある 例 1. php.ini 設定の例 mbstring.language = Japanese; mbstring.internal_encoding = UTF-8 ; mbstring.encoding_translation = On mbstring.http_input = auto ; mbstring.http_output = UTF-8 ; mbstring.detect_order = auto ; mbstring.substitute_character = none ; と http://oshiete1.goo.ne.jp/kotaeru.php3?q=293266 に書いてある方法を試しましたが Fatal error: Call to undefined function: mb_convert_encoding() in c:\php\xmlpaser_sample1.php on line 99 が直りません。 どうすれば直るのでしょうか?

    • ベストアンサー
    • PHP
  • ASCII文字列のgrep

    Windowsのリソースキットのひとつ「subinacl」のコマンドをPHPプログラムからexec()で実行した戻り値に対して、 preg_match()でgrepしようと試しましたが、うまくできませんでした。 $arrAccList = array(); exec("subinacl /verbose=1 /share 【共有名】 , $arrAccList); foreach($arrAccList as $k => $v){  if(preg_match("(grant|deny)", $v)){   print $v;  } } 上記のように書いてみましたがマッチせず、正規表現の部分を「g.r.a.n.t」とするとマッチするという現象です。 mb_detect_encoding()の結果から文字コードはASCIIのようです。 そこでmb_convert_encoding()でASCII⇒EUC-JP、auto⇒EUC-JP・・・と変換してみましたが、 変換された様子が無く、上記と同じ結果となります。 mb_internal_encoding("ASCII")で一時的に内部エンコードを変更してみましたが、やはり同じ結果となりました。 PHPのmbstringの設定は以下のような状態です。 mbstring.detect_order auto mbstring.encoding_translation Off mbstring.func_overload 0 mbstring.http_input pass mbstring.http_output pass mbstring.internal_encoding no value mbstring.language Japanese mbstring.strict_detection Off mbstring.substitute_character no value ASCIIから内部処理文字コードへ変換する方法が間違っているのでしょうか。それとも元々無理な話なのでしょうか。 ご存知の方いらっしゃいましたら、ご教授お願い致します。

    • ベストアンサー
    • PHP
  • 日本語が使いたいのですが[mbstring]設定がわかりません

    環境は winxp sp2 apache 2.0.54 php 5.0.4 argosoftmailserver php.iniの設定は [mbstring] mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none です。足らない事があればお願いします。 下はphpの文です。 <?php $subject = "テスト"; $message = "あいうえお"; $test="日本語エンコーディングテスト"; print "$test (" . mb_detect_encoding($test) . ")<br>"; print ("mbstring.http_input=". mb_http_input() ."<br>"); print ("mbstring.http_output=". mb_http_output() ."<br>"); print ("mbstring.internal_encoding= ".mb_internal_encoding()."<br>"); $subject = mb_convert_encoding($subject, "SJIS", "EUC-JP"); $message = mb_convert_encoding($message , "SJIS", "EUC-JP"); mb_language("Japanese"); $chk = mb_send_mail('******@*******',$subject,$message,'From:***@******.dyndns.org'); if($chk==FALSE) { print "送信失敗"; } else { print "送信完了"; } ?> エンコードテストの結果は以下です。 日本語エンコーディングテスト (SJIS) mbstring.http_input= mbstring.http_output=SJIS mbstring.internal_encoding= EUC-JP よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう