• ベストアンサー

3バイト文字を書きだしたい

恐れ入ります。 表題の通りなのですが、うまく出来ません>< 3バイト文字の判定が \x8F[\xA1-\xFE][\xA1-\xFE] ということでしたので、 試しに以下のようにしてみたのですが、ダメでした。 for ( 161 .. 254 ){ my $tmp=sprintf("\x8f\xa1\x%x", $_); print $tmp; } 【結果】 a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

> eval をつけないとだめなんですね。 質問のコードと似たものをと思って考えたのですが、かえって分かりにくかったかもしれません。 No2 さんのコードを使うのが良いかと思います。 $_ = 161; 1) $tmp = "\xb0\xa1"; 2) $tmp = "\xb0" . pack('C', $_); # No2 さんのコード 3) $tmp = sprintf("\\xb0\\x%x", $_); 1) と 2) は同じもの ("亜" の文字コード) が入りそのまま print $tmp; とすることができますが、 3) は '\xb0\xa1' という文字列が入ので print eval("\"$tmp\""); として2回評価する必要があります。 質問にある先頭の2バイトが "\x8f\xa1" の3バイト文字は、3バイト文字のコード表が手元にない のでよく分からないのですが、私の Vine Linux では何も出力されません。"\x8f\xa1" を "\x8f\xe1" 等に変更して実行すると、出力されるようです。 for ( 161 .. 254 ){ my $tmp = "\x8f\xe1" . pack('C', $_); print $tmp; }

azicyan
質問者

お礼

遅くなって申し訳ありません。 3バイト文字なのですが、 確かに、いろいろ試しても何も表示されませんね・・・ 当方solaris8です。。。 いったい3バイト文字とは何なのでしょうね・・・

その他の回答 (2)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

$tmp を作るのは、以下の様にすれば良いです。 my $tmp = "\x8f\xa1" . pack('C', $_); 理由は No.1 さんの書かれたとおりで、"\xa2" とかの解釈は sprintf の実行より先だからです。 上記だけでうまくいかなければ、 use CGI; を追加して print $tmp; を print CGI::escape($tmp); に変えて、目的通りの内容が出力されてるか確認してください。 # 目的通りの内容を出力しても、画面に日本語文字を表示するには別の問題があるかも知れません。

azicyan
質問者

お礼

遅くなってしまい申し訳ありません。 たしかに何か問題があるのかもしれませんね。 3バイト文字、というのは表示できないみたいです・・・

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

> my $tmp=sprintf("\x8f\xa1\x%x", $_); 上の文は、自動的に何重にも評価されるわけではないのでうまくいきません。以下は、 日本語 EUC の3バイト文字についてよく知らないので、"亜" の文字を例としています。 print "\xb0\xa1\n"; # "亜" と表示 $_ = 161; my $tmp = sprintf("\\xb0\\x%x", $_); print eval("\"$tmp\""), "\n"; # "亜" と表示

azicyan
質問者

お礼

ありがとうございます。 evalをつけないとだめなんですね。

関連するQ&A