【DO!BOOK・ページリンク】 migaro_tech2013 84 / 100 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 である。 |