UTF8でperlスクリプトを書くと年月日が表示しない

このQ&Aのポイント
  • UTF-8で書かれたperlスクリプトで、年月日が表示されない問題について
  • EUCコードでスクリプトを書く場合には年月日が表示されるが、UTF-8で書くと表示されない
  • ダブルクォートで囲むと表示されないが、変数を連結していくと表示される
回答を見る
  • ベストアンサー

UTF8でperlスクリプトを書くと年月日が表示しない

UTF-8で下記スクリプトを書いて実行すると、 $yy年$mo月$dd日 にあたる部分が表示されず、($day)$hh:$mm:$ss の部分しか表示されません。 ------------------------------------ #!/usr/bin/perl use utf8; use Encode; &get_date(); print "Content-type: text/html\;charset=utf-8\n\n"; print encode('utf8',"$date"); exit; sub get_date { ($ss,$mm,$hh,$dd,$mo,$yy,$day)= localtime(time); $day = ("日","月","火","水","木","金","土")[$day]; $yy = $yy+1900; $mo++; if ( $mo < 10 ) { $mo = "0$mo"; } if ( $dd < 10 ) { $dd = "0$dd"; } if ( $hh < 10 ) { $hh = "0$hh"; } if ( $mm < 10 ) { $mm = "0$mm"; } if ( $ss < 10 ) { $ss = "0$ss"; } $date = "$yy年$mo月$dd日($day)$hh:$mm:$ss"; } ------------------------------ EUCコードでスクリプトを書いてencodeなど不要な部分を変更した場合は$yy年$mo月$dd日の部分も表示されます。 また、上記  $date = "$yy年$mo月$dd日($day)$hh:$mm:$ss"; の部分を下記のように変更すると表示されますが... -------------------------- $date = $yy; $date .="年"; $date .= $mo; $date .="月"; $date .= $dd; $date .="日"; $date .="($day)$hh:$mm:$ss"; -------------------------- なぜ一括してダブルクォートで囲むと表示されないのでしょうか? 今まではEUCでスクリプトを書いておりました。UTF8に翻弄されております... どうぞよろしくお願いいたします。

  • Perl
  • 回答数4
  • ありがとう数6

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

Perlはあまり良く知らないのですが use utf8; とすることで変数名に日本語を使えるようになるのではないでしょうか そのせいで$yy年 という変数として処理されているのでは PHPなら "${yy}年${mo}月${dd}日($day)$hh:$mm:$ss"; とするのですがPerlはどうでしょうか *PHPでは最初から変数に日本語が使えるのでよくこの間違いをやっていました

kiku_j
質問者

お礼

"${yy}年${mo}月${dd}日($day)$hh:$mm:$ss" とすることで問題なく表示できました! ありがとうございます!

その他の回答 (3)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.4

sprintf使うなら0パディングはsprintfにやらせた方がすっきりすると思いますよ。 sub get_date { ($ss,$mm,$hh,$dd,$mo,$yy,$day)= localtime(time); $day = ("日","月","火","水","木","金","土")[$day]; return sprintf("%d年%02d月%02d日(%s)%02d:%02d:%02d", $yy+1900,$mo+1,$dd,$day,$hh,$mm,$ss); } > 今はまだEUCでスクリプトを書く方が安全なのでしょうか? 私がperlを使い始めたのはperl5.8以降からなので ずっとUTF-8でperlコードを書いてますが特に困ったことはないですね。 今までEUCで書いてた人がどう思うかは知りませんが。

kiku_j
質問者

お礼

ありがとうございます! >UTF-8でperlコードを書いてますが特に困ったことはないですね。 そうなんですね...ということは私の勉強不足ですね...精進します!

noname#70121
noname#70121
回答No.3

UTF8は時々こういうことありますね。 日本語の正規表現とかもうまく動かなかったりします。 もうこれはしょうがないと諦めて、問題が生じたら逐一処置するしかないですね。 こんなコードではうまく動きました。 $date = sprintf("%s年%s月%s日($day)$hh:$mm:$ss", $yy, $mo, $dd);

kiku_j
質問者

お礼

どうもありがとうございます! そうなんですね...今はまだEUCでスクリプトを書く方が安全なのでしょうか?

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

$yy年 = 2008; print $yy年; とか書いてエラー無く実行できるか確認してみては

kiku_j
質問者

お礼

ほんとですね!$yy年を変数とみなすのですね... 勉強になりました!ありがとうございます!

関連するQ&A

  • 【PL/SQL】DATE型の時刻の表示と非表示

    PL/SQLでのDATE型の取扱いについて教えてください。 初期化パラメータNLS_DATE_FORMATが'YY-MM-DD'で、 ある列を'YYYY/MM/DD HH24:MI:SS'形式でDBにINSERTしたい場合、 dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); としてINSERTにdtWorkEndDateを用いると、 YY-MM-DD形式でDBに登録されてしまいます。 (dtWorkEndDateはDATE型。) ORACLEの設定かPL/SQLの問題なのかわからないのですが、 なにかアドバイスを頂けないでしょうか。 よろしくお願いします。

  • log4jが連続して同じログを

    JSFにて、log4jでログファイルにログ出力を行っているのですが、一回のログ出力メソッド呼び出しで、同じログが2~8行出力されてしまいます。 例) yy/MM/dd HH:mm:ss.853, WARN , .... yy/MM/dd HH:mm:ss.853, WARN , .... yy/MM/dd HH:mm:ss.853, WARN , .... yy/MM/dd HH:mm:ss.853, WARN , .... yy/MM/dd HH:mm:ss.853, WARN , .... yy/MM/dd HH:mm:ss.853, WARN , .... yy/MM/dd HH:mm:ss.853, WARN , .... yy/MM/dd HH:mm:ss.853, WARN , .... ミリ秒単位で同じなので、一回出力されれば十分なのですが、複数行出力されています。 短時間で、かなりのサイズになってしまうため、困惑しております。 この事象の解決方法をご存じの方、解決方法をご教示願います。

  • 日付をVARCHAR2型でYYYYMMDDと表示したい

    DATE型(YYYY/MM/DD HH24:MI:SS)の値を取り出し、 VARCHAR2(8)型の文字列YYYYMMDDにしたいと思っています。 TO_CHAR(DATE型,'YYYYMMDD')としても、YY-MM-DDと表示されてしまいます。 YYYYMMDDと文字型で表示させるにはどうすればよいのでしょうか。 宜しくお願い致します。

  • 月の表示

    HPで今月を表示したいです。 数字がローマ字ですが、漢字で表示したいです。 例えば10月が十月で表示する事が可能ですか? <SCRIPT language="javascript"> dd = new Date(); yy = dd.getYear(); mm = dd.getMonth() + 1; dd = dd.getDate(); if (yy < 2000) { yy += 1900; } if (mm < 10) { mm = "0" + mm; } if (dd < 10) { dd = "0" + dd; } document.write("<FONT size='-1'>"); document.write(mm + "月" ); document.write("</FONT>"); </SCRIPT> 教えてください! お願いします。

  • ダイナミックテキストへの日付の表示がおかしい

    こんにちは、私、Flashチョー初心者です。 環境は、flash8 winXPです。 月の表示だけが、0になってしまうんですが、、、 ダイナミックテキストに時間を割り当てようとして、 以下のように、スクリプトを記述しました。 0月5日9:35 などと表示されてしまいます。 どうしてなのでしょう?  正しく1月と表示したいのですが、どなたか、教えていただけませんか? #####スクリプト######## mydate = new Date(); yy = mydate.getFullYear(); mm = mydate.getMonth(); dd = mydate.getDate(); hh = mydate.getHours(); ii = mydate.getMinutes(); ss = mydate.getSeconds(); cal = (mm+"月"+dd+"日"+hh+":"+ii);

    • ベストアンサー
    • Flash
  • 30分経過したかどうかの判断

    以下のコードで $nowdate(sprintf変換)で日付を得ています。 ($ss,$mn, $hh, $dd, $mm, $yy) = localtime(time); $yy -= 100; $mm++; $nowdate = sprintf("%02d/%02d/%02d_%02d:%02d:%02d:"   ,$yy,$mm,$dd,$hh,$mn,$ss); $nowdate を次に取得した時に、前の$nowdateから30分経過して いるかそうでないかを知りたいのです。なお、前の$nowdateは ファイルに保存しておきその都度読み出すことにしました。 前後で時間を比較するのは、文字列で比較してしまうこと事態が 間違っているのでしょうか。(普通に考えてそうですね) やはり、$yyの大小、$mmの大小・・・という具合に一つ一つ処理 していくしかないのでしょうか。 いいアイデアがあれば教えて下さい。

    • ベストアンサー
    • Perl
  • バッチファイル 時間変数 短縮化

    バッチファイル 時間変数 短縮化 お世話になっております。 WindowsXP環境にて下記のバッチファイルがあります。 コード-------------------------------------------------------------------------------- set BAT_FILE=TIME.bat set LOG_DIR=D:\test set LOG_FILE=LOG.txt set LOG_FILENAME=%LOG_DIR%\%LOG_FILE% set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第一処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% 処理A(プログラムは省略) set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第一処理終了時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第二処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% 処理B(プログラムは省略) set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第二処理終了時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% コード-------------------------------------------------------------------------------- 上記プログラム内の処理A及び、処理Bは比較的長い処理である為、その前後の処理時間帯を上記のように時間変数で取ってログに出力されています。 しかし、上記のように最新の処理時間帯をわざわざ何行もある各時間変数を宣言して取得するのはプログラム的に長くなってしまい、かつ醜いです。 上記方法以外に時間変数のスッキリとした取得方法は無いのでしょうか? ご存知の方がいれば、ご教授願いますでしょうか? 何卒宜しくお願い致します。

  • 年月日+時刻で00:00のときは空白にしたい

    質問をご覧いただきましてありがとうございます。 よろしくお願いいたします。 とあるセルの書式を以下のように設定しています。   mm"月"dd"日( "aaa" )"hh:mm"着" ここに入ってくる値は、"yyyy/MM/dd hh:mm"(年月日+時刻)の場合と"yyyy/MM/dd"(年月日のみ)の場合があります。 このとき、以下のように表記を分けたいのです。 ◆年月日のみ(yyyy/MM/dd)   [入力]2001/01/01   [結果]01月01日(月) 着 ◆年月日+時刻(yyyy/MM/dd hh:mm)   [入力]2001/01/01 15:30   [結果]01月01日(月)15:30着 現在の状態は、年月日だけの入力の場合、   [結果]01月01日(月)00:00着    書式の設定上、当然のことながら上記のように時間の部分が"00:00"と表示されます。 年月日だけの入力の場合に、この"00:00"を空白に置き換えるにはどうしたらいいでしょうか?

  • 一日前のデータのみ表示

    SQL文についてご教授ください。 あるテーブルのいくつかの列をSELECTする際に、 timestampという列に対して、下記のようにしています。 to_char(timestamp, 'yy-mm-dd hh24:mi:ss') DAY そこで、質問です。 timestamp列が、一日前のデータのみ抽出するには、どのように記述すればよいのでか。 timestamp列は、data型です。 DBはOracle10gです。 OSはWindowsServer2003です。 宜しくお願いいたします。

  • 日付の抽出について

    data型、yy/mm/dd hh:mm:ss の形式で入っている日付を、 期間を指定し、時分秒は考慮せず抜き出したいと考えています。 truncなどを使うのだとは思うのですが、例えば、4月1日から 4月5日まで抽出する場合は、どう書けば良いのでしょうか? Where句の指定方法を教えていただけないでしょうか?

専門家に質問してみよう