日本語漢字コ−ドの扱い,コマンド入出力のリダイレクション,コマンドパイプライン

日本語コ−ドとその相互変換

現在のコンピュ−タで日本語文字デ−タを表現して処理する方式は(残念ながら)幾つかの方式がある.この日本語文字の表現形式を「漢字コ−ド形式」,又は「文字エンコ−ディング(encoding)方式」と呼ぶ.現在,主に用いられている漢字コ−ド形式は4つ存在している.

これらの間には直接の互換性は無いので,例えばShift-JISコ−ドで作成されたテキストファイルをUNIXコンピュ−タで扱おうとするとうまく表示できないなどのトラブルが起こる.例えばWindowsパソコンで作成したテキストファイルをUSBメモリで持ち込んできて,本学のLinuxコンピュ−タに読み込んで利用したい場合などが,これに相当する.

そこで,異なるコ−ド形式のファイルを利用する場合は,そのコ−ド形式を適切に変換してやらなければならない.CSE環境では,漢字コード変換用のUNIXコマンドとしてnkfコマンドを用意している.使い方は次のようになる.

nkf オプション 変換元ファイル > 変換先ファイル

変換したいコード 用いるオプション
ISO-2022-jp -j
EUC-jp -e
Shift-JIS -s
UTF-8 -w

例えばSJIS形式のテキストファイルsjis.txtをEUC形式テキストファイルeuc.txtに変換するためには,ターミナル上で次のコマンドラインを実行する.

nkf -e sjis.txt > euc.txt

この場合,SJIS形式のテキストファイルsjis.txtを日本語EUCコードへ変換したeuc.txtが作られる.nkfコマンドの使い方は man nkf で表示されるオンラインマニュアルを参照せよ.

尚,Emacsはこれらの日本語コ−ドを自動的に判断して,そのコ−ドを表す記号をウィンドウ左下のモ−ドラインに表示する.JISコ−ドなら「J」EUCコ−ドなら「E」,Shift-JISなら「S」, UTF-8なら「u」と表示されるので,文字コ−ドが不明のテキストファイルのコード種類を判定したい場合,一旦Emacsで開いてみるとよいだろう.(尚,稀に上手く判定出来ない場合もある.)

提出課題

ディレクトリ に置いてある各ファイルを自分の適当な作業用ディレクトリへコピ−し,以下の操作を行え.尚,変換されたファイル名などは重ならないように注意しながら適切に付けること.

  1. まず,各ファイルをcatコマンドで画面表示させてみて,ターミナルの表示がどのようになるか確認せよ.
  2. sjis_code.txtファイルをnkfコマンドを用いて,EUC-jpコ−ドに変換せよ.変換されたファイルをEmacsで読み込んでみて,EUC-jpコ−ドに変換できたかどうかを確認し,その最先頭行に各自の学生証番号と氏名を記入しなさい.記入が完了した時点でそのEmacsのウィンドウのスクリ−ンショットを記録せよ.スクリーンショットの撮影方法は画像ファイルの活用と各種加工の資料を参照すること.
  3. euc_code.txtファイルをnkfコマンドを用いて,ISO-2022-jp(JIS)コ−ドに変換せよ.変換されたファイルをEmacsで読み込んでみて,JISコ−ドに変換できたかどうかを確認し,その最先頭行に各自の学生証番号と氏名を記入しなさい.記入が完了した時点でそのEmacsのウィンドウのスクリ−ンショットを記録せよ.
  4. jis_code.txtファイルををnkfコマンドを用いて,UTF-8コ−ドに変換せよ.変換されたファイルをEmacsで読み込んでみて,UTF-8コ−ドに変換できたかどうかを確認し,その最先頭行に各自の学生証番号と氏名を記入しなさい.記入が完了した時点でそのEmacsのウィンドウのスクリ−ンショットを記録せよ.

課題提出要領

上記2, 3, 4で記録した合計3枚のスクリ−ンショットを1枚に貼り付けたWebペ−ジを作成せよ.でき上がったページは以下の形式のURIでアクセスできる状態にしておくこと.

締め切り:教員の指示による

漢字コードに関する補足事項

その0 アルファベット記号について

漢字コ−ドに関するJIS規格を調べると, (JIS X 0208が規定する文字一覧表,引用:「漢字袋」 http://kanji.zinbun.kyoto-u.ac.jp/˜yasuoka/kanjibukuro/),漢字に加えてアルファベットや英語記号が含まれていることが判る.

ところが,アルファベットの入力は「英数」キーを押して「英数モード」で入力できるものと「漢字」キーを押して日本語入力状態で入力できるものがあるが,これは一体どういう関係になっているのだろうか?

実は,「英数モード」で入力される文字は1文字が8ビットで表現されるものであり,パソコンが日本語を扱えるようになる以前から使われてきた文字情報である.これを1バイト文字(俗に半角文字と称される)と呼ぶ.これに対し,「日本語モード」で入力されてしまうアルファベットは,コンピュータで取り扱う「漢字」がJIS規格となったときに,「漢字の一部として入れられてしまった文字」であり,技術的にはパソコン内部で漢字と全く同じ取り扱いがされて,1文字が16ビット(或いはそれ以上)で表現されている.これを2バイト文字(俗に全角文字と称される)と呼ぶ.尚,JIS規格として2バイト文字にアルファベットが入れられてしまったのは,技術的には誤りだった可能性が高いと思われる.

これらは,コンピュータ内部で全く別の文字として扱われるから,十分に注意する事が必要となる.

C言語などの各種プログラミング言語に出てくるアルファベットなど,コンピュータ操作の多くの場面でアルファベットや記号といった英数字が良く使われるが,殆どの場合,1バイト文字の英数字が想定されている.従って,英数字の文字入力においては,特に必要ない限り,「英数モード」で入力される1バイト文字を使うように心がけたほうが無用のトラブルに遭遇する可能性が低く,少しだけ幸せになれるだろう.

その1 半角カタカナについて

漢字コ−ドの扱いにおいて,特にしばしば問題になることがあるのがShift-JISコ−ドにおけるカタカナの扱いである. Windows系パソコンを利用して文字入力を行いShift-JISコ−ドのテキストを作成する場合,カタカナとして二種類が入力できてしまう. 一方が「全角カタカナ(正確には2バイトカタカナ)」,他方が「半角カタカナ(1バイトカタカナ)」である.

「全角カタカナ」は内部的には「漢字」と同じ扱いの処理を受けるので問題は起きないが,「半角カタカナ」はコ−ド変換など各種のテキストデ−タ処理において 致命的なトラブルを引き起こすことがあるので要注意である. 例えば,電子メ−ルの送信デ−タとして,この「半角カタカナ」を含むShift-JIS形式テキストを使ってしまうと, 受け取った側で文字化けしてしまってうまく読めないなどのトラブルが容易に引き起こされる.

このため,「半角カタカナ」は利用すべきではない(全角カタカナで十分に代用できる). しかしながら困ったことに世の中でよく使われているMicrosoft社製のソフトウェアは,この半角カタカナを平気で使いまくるので有名なので(最近は,少し良くなったらしい), 利用には細心の注意が必要である. さらに,i-Modeなどの携帯電話によるメールでは「カタカナ」として「半角カタカナ」を標準的に使ってしまっている現状があり, 技術的にはかなり困った事態を引き起こしたりしている.

パソコン操作中,その画面上で「全角/半角」どちらを入力しているのかを見掛けだけで見分けるのは難しいが, 初心者でも出来る簡単な方法として「ガギグゲゴなどの濁音カタカナを入力して,それを一文字つづ削除してみる」というものがある.

入力した文字を一文字ずつ削除してみると,「全角カタカナ」の場合は

全角カタカナ

という具合に濁音カナ1文字づつ削除されるが,「半角カタカナ」場合は

半角カタカナ

というように,「濁音記号」と「カナ文字」が別々に削除されるはずである(つまり,カナ文字と濁点が別々の文字として扱われている).

このようになってしまう場合は「半角カタカナ」文字を入力してしまっている. 無用のトラブルを避けるため,半角カタカナを用いないようにすることが望ましい. 利用しているコンピュータの日本語入力ソフトウェア(例えばWindows であればWindows-IMEやATOKなど)の設定により, 「半角カタカナ」が入力されないように調整できるはずである.

尚,MacOS Xの日本語入力メソッドことえりでは,半角カタカナ入力は標準でオフになっているはずである.

その2 機種依存文字について

コンピュ−タで表示・処理される文字の大部分はJIS規格などで決められているが,特定のコンピュ−タやOSだけでしか利用できない極く少数の文字が存在する.

JIS規格の中でコンピュ−タで利用できる文字種を規定しているのは,JIS X 0208と呼ばれる規格であり,そこで規定されている文字である限り, 適切な漢字コ−ド変換さえ行うことで,ほぼ問題無く機種が異なっていても同じように表示・利用できる. (JIS X 0208が規定する文字一覧表,引用:「漢字袋」 http://kanji.zinbun.kyoto-u.ac.jp/˜yasuoka/kanjibukuro/

しかし,「特殊文字」と呼ばれる記号文字類にはJIS X 0208の規定外となっているものがあり, このような特殊文字を用いたテキストの場合,利用するコンピュ−タによっては,全く表示されなかったり他の文字に化けて見えたりするので注意が必要である. このような特殊文字を「機種依存文字」と呼び,例えば画面上で

機種依存文字一覧

などと表示されて見える文字は機種依存文字の1例である. WindowsパソコンやMacを利用している場合,この「機種依存文字」も簡単に文字入力できてしまう場合があるので注意が必要である.原則として使わないことが望ましい.

特にインタ−ネットの場合,通信相手がどのようなコンピュ−タを利用しているか分からないし,予め予想することもできない. そのため,自分のコンピュ−タでは正しく表示されているのに,相手の(機種が違う)コンピュ−タでは正しく表示できずに内容が読めないことが起こる. ところが,自分自身がいつも利用しているコンピュ−タでは一見うまく表示されているので,相手が読めなくて困っている状況なのに気がつかない. その結果,「読める読めない」とお互いに話が噛み合わないといったことも起こる.

特別に必要がないかぎりはJIS X 0208に規定される文字を使うべきである. 実際のところ,通常の漢字やひらがな及び全角カタカナは全てJIS X 0208に含まれるから,「半角カタカナ」さえ使わないように心がけておけば, 残りは特殊記号に注意していればよい.

近年では携帯電話とメールのやり取りが行えるが,携帯電話の場合は,さらに深刻な機種依存文字の問題が発生している. 自分の利用しているパソコンや携帯電話で見えているからといって,「相手には正しく表示されない」ことは良く起こるので,くれぐれも注意すること.

いわゆる「絵文字」などは典型的機種依存文字問題だろう.

標準入出力とリダイレクション

nkfコマンドなど,UNIXのコマンドの多くは標準入力(stdin)及び標準出力(stdout)と呼ばれるデータの入口と出口を持ち,そのコマンドの処理対象となるデータの入力と処理結果の出力とするものが多い.

通常,標準入力はキ−ボ−ド入力,標準出力は画面出力に結びつけられている.

例えば,nkfコマンドも漢字コ−ド変換された結果は標準出力へ出力され,特に指定しないかぎり画面出力されるが, コマンド > ファイル名と指示すると標準出力を画面表示から該当ファイルへと切り替えることができる.

このように,コマンドの基本的入出力である標準入力・標準出力をファイルと繋げて活用する機能をリダイレクション (redirection)と呼ぶ.

標準出力への出力リダイレクションの例

ターミナルを開き,以下のコマンドを実行してみよう.

mkbka001(506)$ ls

既に学んだように,lsコマンドはカレントディレクトリのファイル名一覧をターミナルのウィンドウに表示するが,これは正確に言えば「lsコマンドがカレントディレクトリのファイル名一覧を調べる処理を行い,その結果を標準出力へ出力した」ということになる.

では,このlsコマンドの標準出力をファイルoutput.txtへリダイレクションしてみよう.

mkbka001(507)$ ls > output.txt

カレントディレクトリにoutput.txtというファイルが出来るはずなので,これをEmacsで開いてみよう.CSE環境の場合,ターミナルからカレントディレクトリにあるテキストファイルをEmacsで開く場合,

mkbka001(508)$ emacs ファイル名

というコマンドを実行すれば,Carbon Emacsで開く事が出来る.(但し,この操作が出来るのはNetBoot環境に限るので,ローカルブート環境で試す場合は,先にCarbon Emacsを起動しておいてから,通常の手順でファイルを読み込むこと.)

また,MacOS X Mountain Lionのターミナルは,標準でUTF-8コードの文字を画面表示するように設定されている.nkfコマンドの標準出力の状態をターミナル上で確認してみよう.まず,ファイルが色々出来ると分らなくなるので,ホームディレクトリにencodeというディレクトリを作成して,そちらへ作業ディレクトリを移して作業する.

mkbka001(509)$ mkdir encode
mkbka001(510)$ cd encode

ファイルlong.txtが次のディレクトリ

に置いてあるので,各自の作業ディレクトリにコピ−せよ.そのディレクトリで状態で次のコマンドを実行してみよ.

mkbka001(511)$ nkf -w long.txt

また,次のコマンドを実行してみよ.

mkbka001(512)$ nkf -w long.txt > utf_long.txt
mkbka001(513)$ cat utf_long.txt

前の例では,nkfコマンドが変換したテキストデ−タが標準出力へ吐き出され,特にリダイレクションの指定がないので結果的に画面上に処理結果が出力される. 後の例では,nkfコマンドの標準出力をファイルutf_long.txtに結びつけるようにリダイレクションしているため, 画面に表示される代りにそっくりそのままファイルに保存される.このためcatコマンドにより,前の例とまったく同じ内容が画面に表示されることになる.

標準入力からの入力リダイレクションの例

多くのUNIXコマンドが標準入力からデータを受け取って処理するように作成されており,その標準入力は特に指定しない限り,キーボード入力へ繋がっている.これを切り替えてファイルから入力データを受け取らせるようにすることが出来る.

これを入力リダイレクションと呼ぶ.

Emacsを起動してencodeディレクトリに次のような数値と英単語からなるファイルnumber.datを作成せよ.

sortコマンドは標準入力から受け取ったテキストを行ごとに並べ替えするコマンドである. コマンド < ファイル名とすることで標準入力とファイルを結びつけることができる.これも入力リダイレクションと呼ばれる.次のコマンドを実行してみよ.画面にはどのような結果が表示されるだろうか?

mkbka001(514)$ sort < number.dat

さらに,並べ替えされた結果をファイルsort_num.datに保存して,その内容をcatコマンドで確認してみよう.以下の例では,入力リダイレクションと出力リダイレクションを合わせて使っている.

mkbka001(515)$ sort < number.dat > sort_num.dat
mkbka001(516)$ cat sort_num.dat

また,リダイレクションを指示しなければ,sortコマンドはキーボードからの入力待ちとなる.以下を実行して,number.datの中身と同じ文字入力をキーボードから入力して与えてみよ.尚,全ての文字をキーボードから与えるのは大変なので,上手にコピー&ペースト機能を使うようにしよう.

また,「キーボード入力が完了」したことをコンピュータに伝えるには,最後にCtrl-D(コントロールD)をタイプする.

mkbka001(517)$ sort

どのような画面出力が出てきたか確認してみよう.

リダイレクションする際の注意

リダイレクトでコマンド出力をファイルを保存する場合,指定されたファイル名のファイルが先に存在していると, そのファイルの中身が予め消去されてからコマンドが実行される. このため,例えば漢字コ−ドを変換して結果を同じ名前のファイルにしようとして,

nkf -e sample.txt > sample.txt

などとすると,コマンドの実行前に予め中身が消去されてしまい,その結果,元のsample.txtファイルの中身がきれいさっぱり消えてしまうので気をつけること.

また,予め存在しているファイルに追加保存したい場合は">"記号の代りに ">>"記号を使えばよい.

コマンドのパイプライン

複数コマンドを"|"記号で繋いで並べることにより,各コマンドの標準出力と標準入力を結び, あるコマンドの処理結果を別のコマンドの入力とすることができる.

これをパイプライン(又はパイプ)と呼ぶ.

以下のコマンドを実行してみよ.

mkbka001(518)$ cat number.dat
mkbka001(519)$ cat number.dat | sort -r 	(-rは逆順に並べるオプション)
mkbka001(520)$ cat nubmer.dat | grep 'five'
		(grepはある文字列パタ−ンが出現する行を抜き出す.この場合fiveという文字列が出現する行が抜き出される.)

上記の例ではcatコマンドの実行結果出力,つまり標準出力を画面表示からsortコマンド及びgrepコマンドの標準入力へ結びつけている. このように標準入力からデ−タを受け取り,標準出力へ処理結果を出力する動作を行うコマンド(プログラム)を「フィルタ(フィルタプログラム)」と呼ぶ.

提出課題

以下のテキストファイルは

全国郵便番号一覧表でありUTF-8文字コードのテキストファイルである. 尚,極めて巨大なファイルであるので,決して自分のディレクトリにコピーして残さないこと!  (一時的に複製しても良いが用が済んだら直ちに削除しておくべし.また,各自のLocalDiskにコピーして持ち帰るのは許可する.)前者は一般の住宅向け郵便番号表であり,後者は大口事業者の郵便番号表である. まず,これらのファイルの巨大さをmoreコマンドで画面表示することで実感してみよ.moreコマンドの画面出力を途中終了する場合はqをタイプすること. また,この一覧表は1行の幅が広いので,予めターミナルを横に広げてから操作すると良い.

これらファイルに対して,以下の課題を行った結果をmoodle学習支援システムにて報告せよ. 尚,一覧表が巨大なため処理時間が少しかかることもあるので慌てないこと.

  1. 京都産業大学に割り当てられた郵便番号は6038555である. この郵便番号に対するデ−タは,どちらの一覧表に載っているかどうか確認せよ. また,載っている場合はどのように載っているのか一字一句間違わないように記録せよ.尚,画面表示される結果を記録するには,標準出力のリダイレクションを行い,コマンドの処理結果をファイルに記録すれば出来る.
  2. 各自の実家(帰省先,通学生の場合は自宅)の郵便番号を示し,その郵便番号に対するデ−タがどのように一覧表に記録されているか調べよ.
  3. 京都市内に割り当てられている郵便番号は何件あるか数えよ. 尚,テキストファイルの行数を数えるコマンドとしてはwcコマンドのl(エル)オプションを利用すればよい(詳細はman wcで調べよ). 例えばファイルnumber.datの行数を数える場合は
    wc -l number.dat
    とすれば数えられるが,wcコマンドはフィルタコマンドとして作られているので,
    cat number.dat | wc -l
    というコマンドパイプラインとして使えることを利用せよ.
  4. 住所の中に,各自の氏名のどれか一文字(例えば「鈴木 太郎」なら「鈴」「木」「太」「郎」,「山田 花子」なら「山」「田」「花」「子」)と同じ漢字がどこかに使われている行を探し,そのうち, どの文字の場合が最も多いのか行数を数えて調べよ.次に,最も行数の多かった文字について,その文字が含まれる行を郵便番号の逆順(大きいものから小さいもの順)に並べかえた上で,その先頭5件分のみを出力させよ.(注: 標準入力から受け取ったテキストの先頭n行を標準出力に出力するフィルタコマンドはheadである. 利用方法はmanコマンドで調べよ.また,留学生の場合で日本の漢字で氏名を扱う事が難しい場合は,氏名として「京産花子」を用いること.)

尚,画面に表示されたものをファイルに記録しておくには,scriptコマンドを使うといいだろう.scriptコマンドの説明は「UNIXコマンドの初歩」を学んだときに聞いているはずだ.

提出要領

上記の課題の実行結果を一つのテキストファイルにまとめるように編集して,moodle学習支援システムにて提出せよ.

Emacsで一つのファイルに別ファイルの内容を取り込む(差し込む)には,「Emacsを用いたテキストファイル編集とファイル印刷」ページの「少し上級向けTips,ファイルの挿入差し込み」を使うのがお勧めだ.

・ファイル名は 各自のログインユーザID.txt と付けること.例えば,自分のユーザIDがg1123456の場合,提出すべきファイル名は g1123456.txtとなる.
尚,ファイル内容の先頭箇所に

学生番号:123456
氏名:山田太郎

という具合に各自の学生番号・氏名を記入しておくこと(当然,自分の学生番号や氏名を記入する). 入れていない場合は評価されない危険性がある.

・各課題の番号と,その課題を遂行するために入力したコマンド列 ,及び,その結果,それぞれを報告せよ.(尚,課題を評価する際には,報告されたコマンド列を実際に実行して報告通りの結果が出力されるかどうかチェックする.従って,コマンド列と実行結果は省略せず正確に報告すること.)

提出期限: 教員の指示による

自分のLocal boot環境へのnkfコマンドのインストール

以下のインストーラを実行する事で各自のMacBookにnkfコマンドをインストール出来る.

nkf_install.tar.gz

上記のアーカイブファイルを手元にダウンロードし,それを開いて展開せよ.アーカイブが展開されてできたフォルダにある nkf_install.command スクリプトを開いて実行することでnkfコマンドがインストールされる. 尚,このインストールスクリプトはデジタル署名されていないのでFinderから開くとGatekeeperの警告が発せられる.「Carbon Emacsのインストール」の記載と同様の方法で対処すること.

基礎プログラミング演習Iの表紙ページへ戻る