【DO!BOOK・ページリンク】
migaro_tech2013   84 / 100

BOOKをみる

10秒後にBOOKのページに移動します


82 ある。修正したコード例を、ソース3 と して示す。【ソース3】  コード例に示したように、 TStringList クラスのSaveToFile メ ソッドにパラメーターを追加するだけで ある。  もし、UTF-8 で保存したければ、50 行目にあるSaveToFile メソッドの第2 パラメーターをTEncoding.UTF8 に変 更するだけである。 ログ出力例をユニコード対応する  低レベル命令群でユニコードの出力を 行うのは若干面倒なことと、TStream 継承クラスを使ったサンプルプログラム も示しておきたいので、こちらのユニ コード対応はTFileStream クラスを使 用するように変更する。  基本的な処理手順は、前述の低レベル 命令群を使ったものと同じである。ただ し、ユニコード化の影響として、以下の ポイントに気を付ける必要がある。 ・ UTF-16 のテキストには、BOM(バイ トオーダーマーク)が必要となる。 ・ 出力データを、バイト配列に変換して から出力する。  TFileStream クラスを使用したコー ド例をソース4 として示す。【ソース4】  低レベル命令群からのTFileStream への置き換えとユニコード対応を同時に 行ったため、大きく変わってしまったが、 ボリュームは全体でも50 行未満とそれ ほどでもないことがわかる。  ポイントとしては、TEncoding を使 い、ログファイルを新規作成する場合に BOM を付加することと、出力したい メッセージを予め変換しておくことであ る。また、網掛けの箇所でメッセージの 変換と出力を行っている。  なお、こちらの例をUTF-8 に対応さ せるには、12 行目のENC 変数への代入 をTEncoding.UTF8にするだけである。 5.まとめ  今回は、Windows 上のテキストファ イルを取り扱う代表的なパターンを2 つ 紹介した。さまざまなシステムが入り乱 れる昨今、他システムとの連携役として ※その2  続いて、文字の取り扱いルールとして のユニコードだが、厳密にはUTF-8、 UTF-16、UTF-32 といったものがある。 これらは本来、ユニコードを取り扱う ルールであって、ユニコードそのもので はない。ただし、実際のプログラムには こちらの影響が大きく、開発者サイドに は馴染みのあるものになっているだろ う。  インターネットでは、アルファベット 等でASCII と互換性のあるUTF-8 が主 流であるが、漢字や仮名をUTF-8 で取 り扱うとほとんどが3 バイト必要になる ため、従来のShift_JIS に比べても効率 が悪くなってしまうことが多い。  そのためか、ユニコード対応版の Delphi/400 は、文字データを基本的に UTF-16 で取り扱っている。  UTF-16 の場合、かなり特殊な文字以 外はすべて2 バイトで表現するように なっている。多バイトデータになるため、 これをファイルに保存する際にはCPU アーキテクチャの影響を受けることにな る。いわゆるエンディアンの問題である。 エンディアンを明示的に指定しなけれ ば、リトルエンディアンとなる。  上記のように、一口にユニコードと 言ってもいろいろな種類があり、テキス ト保存の際にはどういった形式で保存す ればいいのか気を付ける必要がある。し かし、よく使われる形式は、UTF-8 ま たはUTF-16 のリトルエンディアンで あろう。  ちなみに、Windows 標準のメモ帳で Unicode を選択すると、UTF-16 のリト ルエンディアンになる。  では、次から、前章のデータ出力例の ユニコード対応、具体的にはUTF-16 のリトルエンディアンで保存するケース を示していこう。  なお、ユニコード対応が行われた Delphi/400 2009 以降のバージョンを前 提としている。 CSVデータ出力例をユニコード対応 する  TStringList は、エンコーディングを 指定するだけでユニコード対応が可能で 4. ユニコードテキストの 出力  Delphi/400 は2009 以降のバージョン で、ユニコード対応が行われた。しかし、 ファイル出力機能は、Delphi/400 のバー ジョンにかかわらずANSI ベースで行 われる。  つまり、前章で紹介した例を使って ファイル出力すると、ユニコードにしか 存在しない文字は「?」に変換されてし まう。  IBM i では専用のCCSID を指定する 必要があるため、ユニコードが使われな い場合もあるが、他システムとの連動等 を考慮し、ユニコード対応する例も紹介 しておこう。 ユニコードテキストの種類  そもそも「ユニコード」とは一体何だ ろうか。  この問いに正確に答えることは意外と 難しい。非常に乱暴な表現となるが、“こ れまでコンピュータ上で扱えなかったた くさんの文字の集まりとその扱い方をま とめたルール”これを指してユニコード と呼ばれることが多いようである。  しかし、上記したように文字の集まり とその扱い方ルールという2 種類を指し ており、また、それぞれが複数の種類に 分かれている。UCS-2 やUTF-16 といっ た用語を聞いたことはないだろうか。そ れらが、ユニコードと呼ばれるものの正 体に近い。  コラム的に少しだけ細かい説明をした いと思う。プログラムには直接関係がな く、若干複雑な内容であるため、UTF-8 とUTF-16、エンディアンという3 つの 用語だけ覚えておけば、以下の2 段落 (※)は読み飛ばしてもかまわない。 ※その1  まず、文字の集まりとしてのユニコー ドだが、厳密にはUnicode、UCS-2、 UCS-4 といったものがある。このうち Unicode は、2013 年8 月現在でバージョ ン6.2 まで拡張されている。現時点では、 取り扱い可能な文字の多さで並べれば、 UCS-2 < Unicode < UCS-4 となるが、 主流はUnicode である。