%GlobalBinaryStreamにあるテキストデータを漢字コード変換する方法
皆さん、こんにちは。
ストリームデータをデータベースに格納する場合、ファイルなどから読み取る際に漢字コード変換を行い、Unicode形式で%GlobalCharacterStreamに格納されるかと思いますが、時々、バイナリのままで読み込んでしまい、漢字コード変換を行わないといけない状況があるかと思います。
ファイルストリームでしたら%FileCharacterStreamクラスのTranslateTableプロパティに元の漢字コードを指定すれば、以下のようにコード変換しながら読みだすことは可能です。
変数binは%FileBinaryStreamクラスのインスタンス USER>zzdump bin.Read() 0000: E6 97 A5 E6 9C AC E8 AA 9E E3 82 92 E5 90 AB E3 æ.¥æ.¬èª.ã..å.«ã 0010: 82 80 E6 96 87 E5 AD 97 E5 88 97 E3 81 8C E3 81 ..æ..å.å..ã..ã. 0020: A9 E3 81 AE E3 82 88 E3 81 86 E3 81 AB E8 A1 A8 ©ã.®ã..ã..ã.«è¡¨ 0030: E7 A4 BA E3 81 95 E3 82 8C E3 82 8B E3 81 8B E3 示ã..ã..ã..ã..ã 0040: 82 92 E3 83 81 E3 82 A7 E3 83 83 E3 82 AF E3 81 ..ã..ã.§ã..ã.¯ã. 0050: 97 E3 81 A6 E3 81 84 E3 81 BE E3 81 99 0D 0A .ã.¦ã..ã.¾ã.... USER>do bin.Rewind() 1 USER>set stream=##class(%FileCharacterStream).%New() USER>set stream.Filename=bin.Filename <--- ストリームデータを保持しているファイルのファイル名をコピー USER>set stream.TranslateTable="UTF8" <-- UTF-8形式のデータを読み込む USER>write stream.ReadLine() 日本語を含む文字列がどのように表示されるかをチェックしています USER>
一方、グローバルストリームで使用する%GlobalCharacterStreamクラスにはTranslateTableプロパティもないため、一定量のバイナリデータを読み込み、$zcvt()関数で変換し、%GlobalCharacterStreamに書き込むという処理を繰り返す処理を記述することになるのですが、
このような変換処理を行ってくれるのが%IO.MetaCharacterStreamクラスになります。
以下のように%GlobalBinaryStreamのインスタンスにそのデータの漢字コード(この場合はUTF-8)をストリームの属性として指定し、
%IO.MetaCharacterStreamインスタンスを作成する際の引数に%GlobalBinaryStreamインスタンスを指定します。
変数gbinは%GlobalBinaryStreamクラスのインスタンス USER>zzdump gbin.Read() 0000: E6 97 A5 E6 9C AC E8 AA 9E E3 82 92 E5 90 AB E3 æ.¥æ.¬èª.ã..å.«ã 0010: 82 80 E6 96 87 E5 AD 97 E5 88 97 E3 81 8C E3 81 ..æ..å.å..ã..ã. 0020: A9 E3 81 AE E3 82 88 E3 81 86 E3 81 AB E8 A1 A8 ©ã.®ã..ã..ã.«è¡¨ 0030: E7 A4 BA E3 81 95 E3 82 8C E3 82 8B E3 81 8B E3 示ã..ã..ã..ã..ã 0040: 82 92 E3 83 81 E3 82 A7 E3 83 83 E3 82 AF E3 81 ..ã..ã.§ã..ã.¯ã. 0050: 97 E3 81 A6 E3 81 84 E3 81 BE E3 81 99 0D 0A .ã.¦ã..ã.¾ã.... USER>do gbin.Rewind() 1 USER>set gbin.Attributes("CharEncoding")="UTF8" USER>set stream=##class(%IO.MetaCharacterStream).%New(gbin) <--- インスタンス化の際にgbinを引数に指定します。 USER>write stream.ReadLine() 日本語を含む文字列がどのように表示されるかをチェックしています USER>
いかがでしょうか。
このように%IO.MetaCharacterStreamを使用することでバイナリストリームのデータについて、漢字コード変換を行いながらキャラクタストリームとして読み込むことができます。
ぜひ、お試しください!