• ベストアンサー

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

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

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

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

  • ベストアンサー
  • 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

  • 4元連立方程式について

    Excelで方程式を解いたのですがひとつだけ答えが合わないのです。どなたかこの式の違うところを教えてください。 5x-2y+4z+3m=75 x+3y-5z-m=-36 4x-3y+z+4m=51 3x+5y-3z-2m=-12 Excel上での計算式↓ =(A1*E2*C3*D4-A1*E2*C4*D3-A1*E3*C2*D4+A1*E3*C4*D2+A1*E4*C2*D3-A1*E4*C3*D2-A2*E1*C3*D4+A2*E1*C4*D3+A2*E3*C1*D4-A2*E3*C4*D1-A2*E4*C1*D3+A2*E4*C3*D1+A3*E1*C2*D4-A3*E1*C4*D2-A3*E2*C1*D4+A3*E2*C4*D1+A3*E4*C1*D2-A3*E4*C2*D1-A4*E1*C2*D3+A4*E1*C3*2+A4*E2*C1*D3-A4*E2*C3*D1-A4*E3*C1*D2+A4*E3*C2*D1)/(A1*B2*C3*D4-A1*B2*C4*D3-A1*B3*C2*D4+A1*B3*C4*D2+A1*B4*C2*D3-A1*B4*C3*D2-A2*B1*C3*D4+A2*B1*C4*D3+A2*B3*C1*D4-A2*B3*C4*D1-A2*B4*C1*D3+A2*B4*C3*D1+A3*B1*C2*D4-A3*B1*C4*D2-A3*B2*C1*D4+A3*B2*C4*D1+A3*B4*C1*D2-A3*B4*C2*D1-A4*B1*C2*D3+A4*B1*C3*D2+A4*B2*C1*D3-A4*B2*C3*D1-A4*B3*C1*D2+A4*B3*C2*D1)

  • 文字の変換 (アルファベット)

    文字の変換について教えてください 10進数の1は16進数で1、10はAになります。 ではアルファベットはどうなるんでしょうか? 以下の変換であっているでしょうか? a = c1 b = c2 c = c3 d = c4 e = c5 f = c6 g = c7 h = c8 i = c9 j = d1 k = d2 l = d3 m = d4 n = d5 o = d6 p = d7 q = d8 r = d9 s = e1 t = e2 u = e3 v = e4 w = e5 x = e6 y = e7 z = e8 上記の変換が16進数かどうかもわかりませんが、教えてください。 よろしくお願いします。

  • Excelのマクロの組み方を教えてください

    3行と2列のデーターの塊があり、これを 1行のデータに並べ替えるにはどうしたらいいでしょうか? ただし 行方向(縦に) 30件、列方向(横に) 20件ほど入っていて、複雑です。 空白の行や列はないものと考えていただいて結構です。 詳細説明 A1からCB1はタイトルなどが入っていて、無視して、 データーの配列が以下の場合 A2 B2 C2 D2 E2 F2 →CB2まで A3 B3 C3 D3 E3 F3 →CB3まで A4 B4 C4 D4 E4 F4 →CB4まで A5 B5 C5 D5 E5 F5→CB5まで A6 B6 C6 D6 E6 F6→CB6まで A7 B7 C7 D7 E7 F7→CB7まで ↓ ↓ ↓ ↓↓ ↓ A120まで CB120まで を A2 A3 A4 B2 B3 B4 C2 C3 C4 D2 D3 D4 ↓ CA2 CA3 CA4 CB2 CB3 CB4 次に A5 A6 A7 B5 B6 B7 C5 C6 C7 D5 D6 D7 ↓ A118 A119 A120 B118 A119 A120 などと並べかえはどのようにマクロを組めばよいですか?

  • outlook express5の強制終了について

    htmlメールを開こうとすると、下記メッセージが出て、強制終了してしまいます。どういうことでしょうか?初心者ですので、できましたら詳しく教えていただけますか。よろしくお願い致します。 ------------------------------- MSIMN のページ違反です。 モジュール : MCSCAN32.DLL、アドレス : 0177:02684401 Registers: EAX=40744655 CS=0177 EIP=02684401 EFLGS=00010206 EBX=00005000 SS=017f ESP=0056ae60 EBP=53256e3d ECX=0056c8b4 DS=017f ESI=04530030 FS=43af EDX=53256e3d ES=017f EDI=045125c4 GS=439e Bytes at CS:EIP: 83 38 00 75 d9 85 d2 75 08 31 c0 5d 5f 5e 59 5b Stack dump: 0056b94e 045125c4 0056bda4 045125c4 00002710 0269b2d1 00005000 045125c4 0269b37f 00000000 0000ff50 026a061b 6d74683c 0a0d3e6c 683c0a0d 3e646165

  • 数式が入った空白のセルを合計するとき

    数式が入った空白のセルを合計するとき WINDOWS XP EXCELL 2003 です。 各セルの数式は C43 =SUM(B36-C36) D36 =SUMPRODUCT((入力!$C$2:$C$50=$A36)*(入力!$A$2:$A$50=D$1),入力!$E$2:$E$50) E36 =SUMPRODUCT((入力!$D$2:$D$50=$A36)*(入力!$A$2:$A$50=D$1),入力!$F$2:$F$50) E43 =SUM(C43+D36-E36) と数式がそれぞれに入っています。 ご教示を仰ぎたいのは D36,E36 に値がない空白のセルですがこの場合、E43 G43 I43 と表示(この場合 50,000)がされますがD36 若しくはE36に値が表示されたときのみにE43 を表示したいのですが可能でしょうか。 目的は見やすくしたいのですが。 ご指導いたたければ幸甚の至りです。

  • 時刻表を分でソートする方法を教えてもらえませんか?

    NextTrainと言う時刻表表示ソフトを使っているのですが 7種類の時刻表を1つの時刻表ファイルにまとめて 一度で見れるようにしたいのです。 peal初めてで色々と読んでみてもよく解りませんでした。 今の状況は、ActivePerl 5.10.0.1003 をセットアップして、  『Hello World』を表示させる事は出来ました。 『例として6時から8時までをソートしてみます』 【分でソート前】 06: a22 a52  b07 c25 c47 c58 c51   d25    e55 07: a12 a30 a40 a49 a58 c09 c21 c34 c46 c59 d13 d24 d37 d49 e15 e34 e44 e53 08: a07 a17 a28 a38 a47 b04 b45 c12 c25 c38 c51 d02 d21 d32 d42 e58 【分でソート完了】 06: b07 a22 c25 d25 c47 c51 a52 e55 c58 07: c09 a12 d13 e15 c21 d24 a30 c34 e34 d37 a40 e44 c46 a49 d49 e53 a58 c59 08: d02 b04 a07 c12 a17 d21 c25 a28 d32 a38 c38 d42 b45 a47 c51 e58  ※分の前に付いているアルファベットはバスの系統なので必ず付きます。   Perlで無くても簡単に出来る方法があれば教えてください。   アドバイスよろしくお願いします。

    • ベストアンサー
    • Perl
  • ワードの表の高さ変更

    たとえばワードで5×5の表を作成したあと、セルを結合したり分割したりして表を完成させている最中なのですが、高さ変更がうまくいかないセルにぶち当たりました。 指定するセルの高さ(表作成後のA1~A2間)だけ変更したいのですが、ドラッグしても隣の区切り(A2-E4)まで一緒にドラッグされて高さが変わってしまいます。 隣の高さを変えずに希望するセルだけ変更する方法を教えてください。 表デフォルト A1 B1 C1 D1 E1 A2 B2 C2 D2 E2 A3 B3 C3 D3 E3   A4 B4 C4 D4 E4  A5 B5 C5 D5 E5 ↓ 表作成後 A1 B1 C1 D1 E1    B2 C2 D2 E2    B3 C3 D3 E3   A2 B4 C4 D4 E4     B5 C5 D5 E5 ↓ A1~A2を引っ張るとこうなってしまう A1 B1 C1 D1 E1    B2 C2 D2 E2    B3 C3 D3 E3   A2 B4 C4 D4 E4     B5 C5 D5 E5 どうにかして他の列には影響を与えずAのセルだけ高さを自由に変えたい ↓ A1 B1 C1 D1 E1    B2 C2 D2 E2 A2 B3 C3 D3 E3      B4 C4 D4 E4     B5 C5 D5 E5 追記:A1,A2間の区切りをドラッグすると表全体を下に伸ばすことは可能ですが上に伸ばそうとするとB4に入力されている文字にぶつかってこれ以上縮めることはできません 説明がヘタクソで申し訳ないんですがよろしくお願いします

  • チャットができません

    最近PCを買い換えました。そうしたらチャットのみが出来なくなりました・・・98SEからXPへの変更です。 インターネット環境はケーブルテレビ接続です。HPを見ること、ブログ書き込み等は可能です。 チャットルームに入ろうとすると下記の表示がデスクトップにメモ帳で貼り付けられインターネットが遮断されます。 (下に一部貼り付けます) PCもしくはサーバーの設定の所為でしょうか?分かる方宜しくお願いします・・・ # # An unexpected error has been detected by HotSpot Virtual Machine: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d6c20e6, pid=3024, tid=192 # # Java VM: Java HotSpot(TM) Client VM (1.5.0_02-b09 mixed mode) # Problematic frame: # V [jvm.dll+0x820e6] # --------------- T H R E A D --------------- Current thread (0x05426160): JavaThread "main" [_thread_in_vm, id=192] siginfo: ExceptionCode=0xc0000005, reading address 0x00000008 Registers: EAX=0x00000000, EBX=0x00000000, ECX=0x00000008, EDX=0x00000000 ESP=0x0a0f6910, EBP=0x0a0f6948, ESI=0x05426160, EDI=0x00000000 EIP=0x6d6c20e6, EFLAGS=0x00010246 Top of Stack: (sp=0x0a0f6910) 0x0a0f6910: 6d6c494b 00000000 00000000 0542621c 0x0a0f6920: 6d317763 0000000c 0a382923 00000000 0x0a0f6930: 101735a8 00000000 00000000 05447020 0x0a0f6940: 05426160 00000000 0a0f696c 6d304c3a 0x0a0f6950: 0542621c 6d317774 00000000 0542621c 0x0a0f6960: 00000000 00000000 0542621c 0a0f6994 0x0a0f6970: 6d30543a 0542621c 0a0f699f 6d317774 0x0a0f6980: 6d317768 6d317750 05427a54 0542621c

  • 半角と全角の文字数カウント方法

    半角の一文字を1とカウントし、全角の一文字も1とカウントしたいのですが、うまい方法を教えてください。 例) 1111ああああ → 8文字 11111111 → 8文字 ああああああああ → 8文字 自分なりに調べて見たら以下の命令を見つけたのですが、うまく行かないのです。 $n =~ tr/\x00-\x7f/\x00-\x7f/; $nn =~ tr/\xa1-\xfe/\xa1-\xfe/; 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 曲名教えて!何年も困っています。

    子供のころに聞いた曲で気に入っているバイオリンの 曲名が分からず何年も困っています。助けてください。 無伴奏のような感じですが、ピアノの伴奏も若干入る ような気がします。バイオリンを習っている多くの人 が練習するような曲らしいですが。。。 旋律は以下のような感じです。記憶に基づき書いたの で不正確なところもあるかもしれません。調は適当で、 数字は音の高さ。+はシャープ-はフラットです。 どうかよろしくお願いします。 B4- D4 F4 B3- E4 G3 B3- E3 A4 C4 E4 A3 D4 F3 A3 D3 G4 B3- D4 G3 A3 E4 F4 D4 D4 C4+ D4 E4 A3 A4 D5 C5 ←この辺からさび? B4- C5 D5 F5 E5 D5 C5 G4 A4 C5 F4 E4 D4 F4 B3- A3 G3+ B3 E4 B4 C5+ A4 D5 F4 B4- D4 G4 D5 A5 D5 A5 A4 D5

専門家に質問してみよう