(57)【特許請求の範囲】
【請求項１】
コンピュータが、
第１の文字コードのデータを最長一致探索により圧縮した符号列に含まれる符号を、スライド窓を用いて最長一致となる特定の固まりのバイト列を示す部分データに伸長し、伸長した部分データを記憶領域に蓄積し、
前記符号を伸長したタイミングで、該伸長された部分データであって前記記憶領域に蓄積された部分データに対し、前記第１の文字コードの情報に基づいて、文字区切りを検出したかどうかを判定し、
前記記憶領域に蓄積された部分データに前記文字区切りを検出したと判定された場合に、該検出された文字区切りで区切られた単位で、前記第１の文字コードと第２の文字コードとを対応づけた情報に基づいて、該伸長された部分データの少なくとも一部を、前記第２の文字コードのデータに変換する
処理を実行することを特徴とする伸長方法。
【請求項２】
前記判定する処理は、文字の先頭バイトの文字コードと文字の文字コードの長さを示す文字長との対応関係に基づいて、前記記憶領域に蓄積された部分データの先頭バイトの文字コードに対応する文字長を取得し、前記記憶領域に蓄積された部分データの長さが、取得された文字長以上であるか否かを判定することで前記部分データに前記文字区切りを検出したかどうかを判定し、
前記変換する処理は、前記判定する処理によって前記記憶領域に蓄積された部分データの長さが、取得された文字長以上であると判定された場合に、前記部分データに前記文字区切りを検出したと判定し、前記記憶領域に蓄積された部分データの先頭から前記文字長分のデータを前記第２の文字コードのデータに変換する
処理を実行することを特徴とする請求項１に記載の伸長方法。
【請求項３】
前記変換する処理は、前記記憶領域に蓄積された部分データの先頭から前記文字長分のデータを前記第２の文字コードのデータに変換するとともに、前記文字長分のデータを削除する方向にシフトする
処理を実行することを特徴とする請求項２に記載の伸長方法。
【請求項４】
前記変換する処理は、文字毎に変換元の文字コードのデータと変換先の文字コードのデータとを対応付けた変換情報であって、変換元の文字コードおよび変換先の文字コードを組とした複数の変換情報から、変換元の文字コードおよび変換先の文字コードに応じた変換情報を選択し、選択した変換情報を用いて、前記記憶領域に蓄積された部分データの先頭から前記文字長分のデータを変換先の文字コードのデータに変換する
処理を実行することを特徴とする請求項２に記載の伸長方法。
【請求項５】
第１の文字コードのデータを最長一致探索により圧縮した符号列に含まれる符号を、スライド窓を用いて最長一致となる特定の固まりのバイト列を示す部分データに伸長し、伸長した部分データを記憶領域に蓄積する伸長部と、
前記符号を伸長したタイミングで、前記伸長部によって伸長された部分データであって前記記憶領域に蓄積された部分データに対し、前記第１の文字コードの情報に基づいて、文字区切りを検出したかどうかを判定する検出部と、
前記検出部によって前記記憶領域に蓄積された部分データに前記文字区切りを検出したと判定された場合に、該検出された文字区切りで区切られた単位で、前記第１の文字コードと第２の文字コードとを対応付けた情報に基づいて、前記伸長された部分データの少なくとも一部を、前記第２の文字コードのデータに変換する変換部と、
を有することを特徴とする伸長装置。
【請求項６】
コンピュータに、
第１の文字コードのデータを最長一致探索により圧縮した符号列に含まれる符号を、スライド窓を用いて最長一致となる特定の固まりのバイト列を示す部分データに伸長し、伸長した部分データを記憶領域に蓄積し、
前記符号を伸長したタイミングで、該伸長された部分データであって前記記憶領域に蓄積された部分データに対し、前記第１の文字コードの情報に基づいて、文字区切りを検出したかどうかを判定し、
前記記憶領域に蓄積された部分データに前記文字区切りを検出したと判定された場合に、該検出された文字区切りで区切られた単位で、前記第１の文字コードと第２の文字コードとを対応づけた情報に基づいて、該伸長された部分データの少なくとも一部を、前記第２の文字コードのデータに変換する
処理を実行させることを特徴とする伸長プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、伸長方法、伸長プログラムおよび伸長装置に関する。
【背景技術】
【０００２】
圧縮データに対し、文字コード変換が必要な場合、一般的に伸長処理と文字コード変換処理の順に２パスで実施される（例えば、特許文献１参照）。したがって、伸長処理の結果を記憶する記憶領域が準備される必要がある。
【０００３】
圧縮伸長アルゴリズムとしては、ＬＺ７７を用いたＺＩＰが主流である。ＺＩＰでは、圧縮対象の文字列に対して、スライド窓を用いて最長一致の文字列を判定し、圧縮データを生成する。一方、伸長対象の圧縮データに対して、スライド窓を用いて最長一致の文字列を判定し、伸長データを生成する。スライド窓を用いた最長一致文字列の判定は、バイト単位で行われる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００３−３００３０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、圧縮データに対し、伸長処理後に文字単位にコード変換を行う場合、圧縮データの伸長処理と、文字コード変換処理のバイト長が異なるため、別個に処理を実行する必要があるという問題がある。このため、一例として、記憶領域に無駄が生じるという問題がある。一方、別の観点では、処理時間が長くなるという問題がある。
【０００６】
例えば、ＺＩＰの場合、圧縮処理および伸長処理において、最長一致の判定が、バイト単位で行われるのに対して、文字コード変換処理は、文字単位で行われる。文字の長さは、ＣＪＫ文字を含むＵＴＦ−８などの文字コード系では、１〜４バイトのいずれかであることが知られている。つまり、１バイトで表現される文字（例えば、英数字など）もあれば、３バイトで表現される文字（例えば、漢字第１種の一部、第２種漢字およびかな文字など）、４バイトで表現される文字（例えば、漢字第３・第４水準の一部など）も存在する。したがって、伸長処理の最長一致により、バイト単位に生成された伸長データは、文字のバイト単位と異なる。そのため、そのまま文字を単位とする文字コード変換処理に引き渡すことができず、１パスで伸長と文字コード変換を実行することができない。この結果、伸長処理は、圧縮データ全体の伸長結果を記憶領域に記憶することが必要となり、記憶領域に無駄が生じる。また、伸長処理および文字コード変換処理の処理時間が長くなる。
【０００７】
圧縮データの伸長処理と、文字コード変換処理を、別個の処理として行う必要があるという問題について、図１Ａおよび図１Ｂを参照して説明する。図１Ａは、ＬＺ７７系を利用した伸長変換処理を示す図である。図１Ａに示すように、伸長処理は、圧縮データを全て伸長し、全て伸長した伸長データを記憶領域に記憶する。そして、文字コード変換処理は、記憶領域に記憶された全ての伸長データの文字コードを変換し、変換データを生成する。
【０００８】
図１Ｂは、ＬＺ７７系を利用した伸長変換処理を示す図である。図１Ｂでは、ＵＴＦ−８の文字コードにおける圧縮データを伸長する場合について説明する。図１Ｂに示すように、記憶領域Ａ１、Ａ２およびＢ１、Ｂ２が、例えば、それぞれメモリ内に確保される。記憶領域Ｂ１は、例えばリードバッファと呼ばれる。伸長処理は、記憶領域Ｂ１に格納された圧縮データを、スライド窓に対応した記憶領域Ａ１とＡ２を用いて最長一致判定を行うことにより伸長する。記憶領域Ａ１は、例えば符号化部と呼ばれる。記憶領域Ａ２は、例えば参照部と呼ばれる。そして、伸長処理は、伸長された伸長データをそのまま記憶領域Ａ２とＢ２に書き込む。記憶領域Ｂ２は、例えばライトバッファと呼ばれる。
【０００９】
例えば、伸長処理の１つ目の最長一致では、記憶領域Ｂ１に格納された圧縮データを、記憶領域Ａ１とＡ２を用いて伸長する。すなわち、伸長処理は、バイト単位で行われるので、伸長された伸長データの文字の区切りを認識しない。そして、伸長処理は、伸長された伸長データをそのまま記憶領域Ａ２とＢ２に書き込む。図１Ｂの例では、１つ目の最長一致で伸長された伸長データは、“Ｅ２ＢＣ９８Ｅ３８６”である。この場合、記憶領域Ｂ２に書き込まれるデータも、伸長データそのままの“Ｅ２ＢＣ９８Ｅ３８６”である。“Ｅ２ＢＣ９８Ｅ３８６”は、「十」（０ｘＥ２ＢＣ９８）と文字の区切りに満たない「□」（０ｘＥ３８６）からなる。つまり、文字コードの境界とずれたままの「泣き別れ」が発生している。そして、２つ目の最長一致のデータ“９３”が記憶領域Ｂ２に書き込まれると、文字の区切りを満たす「二」（０ｘＥ３８６９３）が生成される。このように、伸長処理は、バイト単位で行われるのに対して、文字コード変換処理は、文字単位で行われるので、伸長処理で得られた伸長データをそのまま文字コード変換することができない。したがって、ＬＺ７７系を利用した伸長処理は、圧縮データ全体の伸長を行なってから伸長後の伸長データに対して文字コード変換することとなり、文字コード変換結果分の記憶領域Ｂ３を必要とし、伸長処理に用いられる記憶領域Ａ２に無駄が生じる。また、伸長処理および文字コード変換処理の処理時間が長くなる。
【００１０】
１つの側面では、伸長処理と文字コード変換処理に用いられる記憶領域の無駄または効率低下を抑制することを目的とする。また、１つの側面では、伸長処理および文字コード変換処理の処理時間を短縮することを目的とする。
【課題を解決するための手段】
【００１１】
１つの実施態様の伸長方法では、コンピュータが、第１の文字コードのデータを圧縮した符号列に含まれる符号を部分データに伸長し、該伸長された部分データに対し、前記第１の文字コードの情報に基づいて、文字区切りを検出し、該検出された文字区切りで区切られた単位で、前記第１の文字コードと第２の文字コードとを対応づけた情報に基づいて、該伸長された部分データの少なくとも一部を、前記第２の文字コードのデータに変換する処理を実行する。
【発明の効果】
【００１２】
１つの態様によれば、一括伸長後に変換する場合と比べ伸長処理と文字コード変換処理に用いられる記憶領域の無駄または効率低下を抑制することができる。また、一括伸長後に変換する場合と比べ伸長処理および文字コード変換処理の処理時間を短縮することができる。
【図面の簡単な説明】
【００１３】
【図１Ａ】図１Ａは、ＬＺ７７系を利用した伸長変換処理を示す図である。
【図１Ｂ】図１Ｂは、ＬＺ７７系を利用した伸長変換処理を示す図である。
【図２Ａ】図２Ａは、ＬＺ７７系を利用した伸長処理の一例を示す図である。
【図２Ｂ】図２Ｂは、ＬＺ７７系を利用した伸長処理の一例を示す図である。
【図２Ｃ】図２Ｃは、ＬＺ７７系を利用した伸長処理の一例を示す図である。
【図２Ｄ】図２Ｄは、ＬＺ７７系を利用した伸長処理の一例を示す図である。
【図２Ｅ】図２Ｅは、ＬＺ７７系を利用した伸長処理の一例を示す図である。
【図２Ｆ】図２Ｆは、ＬＺ７７系を利用した伸長処理の一例を示す図である。
【図３Ａ】図３Ａは、実施例に係る伸長変換処理を示す図（１）である。
【図３Ｂ】図３Ｂは、実施例に係る伸長変換処理を示す図（２）である。
【図４Ａ】図４Ａは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｂ】図４Ｂは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｃ】図４Ｃは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｄ】図４Ｄは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｅ】図４Ｅは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｆ】図４Ｆは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｇ】図４Ｇは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｈ】図４Ｈは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｉ】図４Ｉは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｊ】図４Ｊは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｋ】図４Ｋは、実施例に係る伸長変換処理の一例を示す図である。
【図４Ｌ】図４Ｌは、実施例に係る伸長変換処理の一例を示す図である。
【図５】図５は、伸長装置の機能構成の第１の例を示す図である。
【図６】図６は、伸長装置の機能構成の第２の例を示す図である。
【図７】図７は、文字コード変換テーブルのデータ構造の一例を示す図である。
【図８】図８は、伸長変換処理のフローチャートを示す図である。
【図９】図９は、伸長装置のハードウェア構成を示す図である。
【発明を実施するための形態】
【００１４】
以下に、本願の開示する伸長方法、伸長プログラムおよび伸長装置の実施例を図面に基づいて詳細に説明する。なお、実施例によりこの発明が限定されるものではない。
【実施例】
【００１５】
まず、ＬＺ７７系を利用した伸長処理について説明する。
【００１６】
［ＬＺ７７系を利用した参考例に係る伸長処理の一例］
図２Ａ〜図２Ｆは、ＬＺ７７系を利用した伸長処理の一例を示す図である。図２Ａに示すように、記憶領域Ａ１、Ａ２、および、Ｂ１、Ｂ２が、それぞれメモリ内に確保される。記憶領域Ａ１とＡ２は、スライド窓に対応し、例えば、符号化部と参照部と呼ばれる。記憶領域Ｂ１とＢ２は、例えば、リードバッファとライトバッファと呼ばれる。また、ポインタＰＢ１、ＰＢ２、ＰＡ２が、それぞれメモリ内に設定される。ファイルＦ１内のコンテンツ部分の圧縮データは、記憶領域Ｂ１にリードされる。リードバッファＢ１には、「十一才から十二才まで」という処理対象の文字列について、ＵＴＦ−８における文字コードをＬＺ系圧縮した圧縮データが含まれる。なお、リードバッファＢ１に含まれる「△△△」は、「才から」という文字列の圧縮データであるとする。
【００１７】
ここで、図示されていない圧縮処理では、処理対象の文字列の文字コードについて、既に処理された文字コードとの間で最も長く一致するデータ（最長一致データ）が探索される。既に処理された文字コードは、記憶領域Ａ２に格納される。最長一致データが３バイト未満であった場合、各文字が、それぞれ、１バイト毎に圧縮データとして生成される。圧縮データには、最長一致データに基づく圧縮データでない旨を示す識別子（例えば、「０」）が先頭に含まれる。ここでは、記憶領域Ｂ１の「０ｂＥ２ｈ」、「０ｂＢＣｈ」、「０ｂ９８ｈ」などが、最長一致データに基づく圧縮データでない旨を示す識別子を含む圧縮データである。また、圧縮データの一部として文字コードそのものが用いられることは、一例であり、ハフマン符号化／復号化アルゴリズムにより符号化して得られるハフマン符号が用いられても良いし、他の圧縮アルゴリズムが用いられても良い。
【００１８】
一方、３バイト以上の最長一致データが探索された場合には、最長一致データの記憶領域Ａ２内での位置と、最長一致データのデータ長に基づき圧縮データが生成される。圧縮データには、最長一致データに基づく圧縮データである旨を示す識別子（例えば、「１」）が先頭に含まれる。ここでは、記憶領域Ａ３の「１ｂ００００ｈ０５ｈ」が、最長一致データに基づく圧縮データである旨を示す識別子を含む圧縮データである。
【００１９】
このような状況の下、伸長処理は、図２Ａに示すファイルＦ１内のコンテンツ部分のデータを、記憶領域Ｂ１にリードする。伸長処理は、記憶領域Ｂ１にリードされた圧縮データを、順次記憶領域Ａ１に読み出す。ポインタＰＢ１は、記憶領域Ｂ１内の次に読み出される位置を指す位置情報（リードポインタ）である。ここでは、記憶領域Ｂ１の圧縮データ「０ｂＥ２ｈ」が、ポインタＰＢ１を介して、記憶領域Ａ１に読み出される。読み出された圧縮データは、圧縮データに含まれる識別子に応じた伸長処理が行われる。伸長処理は、識別子が、最長一致データに基づく圧縮データでない旨を示す識別子（図２の例では「０」）である場合、圧縮データの１文字を伸長し、伸長された１文字を記憶領域Ａ２および記憶領域Ｂ２に格納する。ここでは、識別子が「０」であるので、文字コードそのものの「Ｅ２ｈ」（０ｘＥ２）が記憶領域Ａ２および記憶領域Ｂ２に格納される。そして、伸長処理は、ポインタＰＢ１、ポインタＰＢ２およびポインタＰＡ２の内容を更新する。ポインタＰＡ２は、記憶領域Ａ２内の末尾を指す位置情報（末尾ポインタ）である。ポインタＰＢ２は、記憶領域Ｂ２内の次に書き込まれる位置を指す位置情報（ライトポインタ）である。
【００２０】
次に、図２Ｂに示すように、伸長処理は、記憶領域Ｂ１の圧縮データ「０ｂＢＣｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。読み出された圧縮データは、圧縮データに含まれる識別子に応じた伸長処理が行われる。ここでは、識別子が「０」であるので、文字コードそのものの「ＢＣｈ」（０ｘＢＣ）が記憶領域Ａ２および記憶領域Ｂ２に格納される。そして、伸長処理は、ポインタＰＢ１、ポインタＰＢ２およびポインタＰＡ２の内容を更新する。
【００２１】
次に、図２Ｃに示すように、伸長処理は、記憶領域Ｂ１の圧縮データ「０ｂ９８ｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。読み出された圧縮データは、圧縮データに含まれる識別子に応じた伸長処理が行われる。ここでは、識別子が「０」であるので、文字コードそのものの「９８ｈ」（０ｘ９８）が記憶領域Ａ２および記憶領域Ｂ２に格納される。そして、伸長処理は、ポインタＰＢ１、ポインタＰＢ２およびポインタＰＡ２の内容を更新する。
【００２２】
次に、図２Ｄに示すように、記憶領域Ｂ１の圧縮データについて、繰り返し伸長処理が行われ、「十一才から」という文字列に対応する圧縮データが、ＵＴＦ−８におけるコードに伸長される。記憶領域Ａ１および記憶領域Ａ２には、「Ｅ２ＢＣ９８ｈＥ３８６９２ｈ○ｈ○ｈ○ｈ」が格納される。格納された文字コードは、「十一才から」という文字列に対応する文字コードである。
【００２３】
次に、図２Ｅに示すように、伸長処理は、記憶領域Ｂ１の圧縮データ「１ｂ００００ｈ０５ｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。読み出された圧縮データは、圧縮データに含まれる識別子に応じた伸長処理が行われる。伸長処理は、識別子が、最長一致データに基づく圧縮データである旨を示す識別子（図２の例では「１」）である場合、圧縮データに基づいて最長一致文字列を伸長する。伸長処理は、伸長された文字列を記憶領域Ａ２および記憶領域Ｂ２に格納する。ここでは、識別子が「１」であるので、圧縮データに含まれる最長一致データのデータ長および位置の情報に基づいて、記憶領域Ａ２から文字コード列が読み出される。すなわち、最長一致データのデータ長が「０５ｈ」、位置の情報が「００００ｈ」に基づいて、伸長された文字列「Ｅ２ＢＣ９８ｈＥ３８６ｈ」が読み出される。そして、伸長処理は、読み出された文字列「Ｅ２ＢＣ９８ｈＥ３８６ｈ」を、記憶領域Ａ２および記憶領域Ｂ２に格納する。そして、伸長処理は、ポインタＰＢ１、ポインタＰＢ２およびポインタＰＡ２の内容を更新する。この結果、記憶領域Ｂ２に格納された「Ｅ２ＢＣ９８ｈＥ３８６ｈ」の「Ｅ３８６ｈ」は、文字の区切りに満たないので、泣き別れが発生している。
【００２４】
そして、図２Ｆに示すように、伸長処理は、記憶領域Ｂ１の圧縮データ「０ｂ９３ｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。読み出された圧縮データは、圧縮データに含まれる識別子に応じた伸長処理が行われる。ここでは、識別子が「０」であるので、文字コードそのものの「９３ｈ」（０ｘ９３）が記憶領域Ａ２および記憶領域Ｂ２に格納される。そして、伸長処理は、ポインタＰＢ１、ポインタＰＢ２およびポインタＰＡ２の内容を更新する。この結果、記憶領域Ｂ２の「Ｅ３８６９３ｈ」は、文字の区切りを満たすこととなり、泣き別れが解消されることになる。
【００２５】
その後、圧縮データが全て伸長されると、伸長処理は、記憶領域Ｂ２に記憶されたＵＴＦ−８における文字コード列から１文字に対応する文字コード列を切り出し、予め指定された文字コード系の文字コード列に変換する。そして、伸長処理は、変換した文字コード列を記憶領域Ｂ３に格納する。記憶領域Ｂ３は、例えば、変換後バッファである。ここでは、ＵＴＦ−８からシフトＪＩＳに変換された結果が表されている。そして、伸長処理は、記憶領域Ｂ３の変換データに基づいて、ファイルＦ２を生成する。
【００２６】
これにより、ＬＺ７７系を利用した参考例に係る伸長処理では、圧縮データの伸長結果を文字コード変換が行われた状態にする場合、全ての伸長結果を蓄積する記憶領域Ｂ２と全ての変換結果を蓄積する記憶領域Ｂ３とを要するので、記憶領域の増大が見込まれる。すなわち、かかる伸長処理では、全ての伸長結果を蓄積する記憶領域Ｂ２を必要とし、伸長処理に用いられる記憶領域Ｂ２に無駄が生じる。また、かかる伸長処理では、伸長処理に用いられる記憶領域Ｂ２へのＩ／Ｏが発生するため、文字コード変換処理を含む伸長処理の処理時間が長くなる。
【００２７】
［実施例に係る伸長変換処理］
図３Ａおよび図３Ｂは、実施例に係る伸長変換処理を示す図である。図３Ａに示すように、伸長変換処理は、圧縮データ毎に、参照部を用いて圧縮データを伸長し、伸長した伸長データを中間伸長部に蓄積する。伸長変換処理は、中間伸長部に蓄積した伸長データの先頭バイトに基づいて文字長を取得する。そして、伸長変換処理は、中間伸長部の蓄積された伸長データが文字長以上となった場合に、文字変換部を用いて中間伸長部の先頭から文字長分の伸長データの文字コードを変換し、変換データを生成する。なお、圧縮データを伸長した結果の伸長データは、部分データの一例である。
【００２８】
図３Ｂに示すように、記憶領域Ａ１〜Ａ４，Ｂ１、Ｂ２が、例えば、それぞれメモリ内に確保される。なお、記憶領域Ａ１（例えば、符号化部）、Ａ２（例えば、参照部）、Ｂ１（例えば、リードバッファ）、および、Ｂ２（例えば、ライトバッファ）は、図１Ｂに示す伸長処理と同一の構成である。伸長変換処理は、最長一致の形式により圧縮された符号列内の符号を、記憶領域Ａ１とＡ２を用いて最長一致となる特定の固まりのバイト列を示すデータ列に伸長し、伸長したデータ列（伸長データ）を記憶領域Ａ３に記憶する。記憶領域Ａ３は、例えば、中間伸長部と呼ばれる。そして、伸長変換処理は、記憶領域Ａ３に蓄積されたデータ列に第１の文字コードの文字を認識すると、認識した文字のデータ列を第２の文字コードのデータ列に変換する。
【００２９】
例えば、伸長変換処理は、ＵＴＦ−８における文字コードを伸長する場合、記憶領域Ｂ１に格納された圧縮データを、記憶領域Ａ１とＡ２を用いて伸長し、伸長された伸長データを記憶領域Ａ２に格納する。そして、伸長変換処理は、伸長された伸長データを記憶領域Ｂ２では無く、記憶領域Ａ３に書き込む。ここでは、伸長変換処理は、バイト単位で伸長するので、伸長された伸長データのＵＴＦ−８の文字の区切りを認識しない。
【００３０】
そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトに基づいて、１文字に対応する文字コードの長さを文字長として取得する。一例として、先頭バイトが「Ｅ２」である場合、文字長は３バイトになる。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。そして、伸長変換処理は、取得した文字長以上であると判定した場合、記憶領域Ａ３に記憶された伸長データに文字の区切りを検知する。そして、伸長変換処理は、記憶領域Ａ３に記憶された文字長分の伸長データを記憶領域Ａ４に格納する。図３の例では、先行して伸長された伸長データは、“Ｅ２ＢＣ９８Ｅ３８６”である。記憶領域Ａ３に記憶された伸長データ“Ｅ２ＢＣ９８Ｅ３８６”の長さは５であり、伸長データの先頭バイトが「Ｅ２」であるので文字長は３である。伸長データの長さ（５）は、文字長（３）以上であるので、文字長以上であると判定される。記憶領域Ａ３に記憶された文字長（３）分の「Ｅ２ＢＣ９８」が記憶領域Ａ４に格納される。ここでは、伸長変換処理は、伸長データに文字の区切りを認識する。つまり、文字コードの境界とずれたままの「泣き別れ」の発生が抑制される。
【００３１】
そして、伸長変換処理は、記憶領域Ａ４に格納された伸長データを送信先で用いられる文字コードに変換し、記憶領域Ｂ２に書き込む。記憶領域Ｂ２は、例えばライトバッファと呼ばれる。図３Ｂの例では、記憶領域Ａ４に記憶されたＵＴＦ−８の「Ｅ２ＢＣ９８」は、シフトＪＩＳの「８Ｆ５Ｃ」に変換され、変換データとして記憶領域Ｂ２に書き込まれる。
【００３２】
次に、伸長変換処理は、次に伸長された伸長データを記憶領域Ａ２に格納する。ここでは、伸長変換処理は、バイト単位で伸長するので、伸長された伸長データのＵＴＦ−８の文字の区切りを認識しない。そして、伸長変換処理は、伸長された伸長データを記憶領域Ａ３に書き込む。
【００３３】
そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトに基づいて、文字長を取得する。一例として、先頭バイトが「Ｅ３」である場合、文字長は３バイトである。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。そして、伸長変換処理は、取得した文字長以上であると判定した場合、記憶領域Ａ３に記憶された伸長データに文字の区切りを検知する。そして、伸長変換処理は、記憶領域Ａ３に記憶された文字長分の伸長データを記憶領域Ａ４に格納する。図３Ｂの例では、次に伸長された伸長データは、“９３”である。記憶領域Ａ４に記憶された残りの伸長データ“Ｅ３８６”と次に伸長された伸長データ“９３”の長さはトータルで３であり、伸長データの先頭バイトが「Ｅ３」であるので文字長は３である。伸長データの長さ（３）は、文字長（３）以上であるので、文字長以上であると判定され、文字長までの「Ｅ３８６９３」が記憶領域Ａ４に格納される。ここでは、伸長変換処理は、伸長データに文字の区切りを認識する。つまり、文字コードの境界とずれたままの「泣き別れ」の発生が抑制される。
【００３４】
そして、伸長変換処理は、記憶領域Ａ４に格納された伸長データを送信先で用いられる文字コードに変換し、記憶領域Ｂ２に書き込む。図３Ｂの例では、記憶領域Ａ４に記憶されたＵＴＦ−８の「Ｅ３８６９３」は、シフトＪＩＳの「９３Ｆ１」に変換され、変換データとして記憶領域Ｂ２に書き込まれる。
【００３５】
これにより、伸長変換処理は、バイト単位で伸長するが、伸長データの文字の区切りを判別して文字の区切りまでの伸長データを文字コード変換し、変換データを記憶領域Ｂ２（例えば、ライトバッファ）に格納する。このため、伸長変換処理は、全ての伸長データを蓄積する記憶領域を準備しなくてもよく、伸長処理に用いられる記憶領域の無駄をなくすことができる。また、伸長変換処理は、全ての伸長データを記憶領域に蓄積したり、当該記憶領域から伸長データを読み出したりしないで、文字コード変換処理を実現できるので、処理時間が短縮できる。
【００３６】
［実施例に係る伸長変換処理の一例］
図４Ａ〜図４Ｌは、実施例に係る伸長変換処理の一例を示す図である。図４Ａに示すように、記憶領域Ａ１〜Ａ４、Ｂ１、Ｂ２が、それぞれメモリ内に確保される。また、ポインタＰＢ１、ＰＢ２、ＰＡ２が、それぞれメモリ内に設定される。なお、記憶領域Ａ１、Ａ２、Ｂ１、Ｂ２、およびポインタＰＢ１、ＰＢ２、ＰＡ２は、図１Ｂに示す伸長処理と同一の構成である。記憶領域Ａ３は、例えば、中間伸長部と呼ばれる。記憶領域Ａ４は、例えば、文字変換部と呼ばれる。ファイルＦ１内のコンテンツ部分の圧縮データは、記憶領域Ｂ１にリードされる。リードバッファＢ１には、「十一才から十二才まで」という処理対象の文字列について、ＵＴＦ−８におけるコードをＬＺ系圧縮した圧縮データが含まれる。なお、リードバッファＢ１に含まれる「△△△」は、「才から」という文字列の圧縮データであるとする。また、圧縮データは、前述した最長一致データの探索により得られる形式のデータであるとする。
【００３７】
このような状況の下、伸長変換処理は、図４Ａに示すファイルＦ１内のコンテンツ部分のデータを、記憶領域Ｂ１にリードする。そして、伸長変換処理は、記憶領域Ｂ１にリードされた圧縮データを、順次記憶領域Ａ１に読み出す。ポインタＰＢ１は、記憶領域Ｂ１内の圧縮データの読み出し位置を指すリードポインタである。ここでは、記憶領域Ａ３の圧縮データ「０ｂＥ２ｈ」が、記憶領域Ａ１に読み出される。そして、伸長変換処理は、読み出した圧縮データについて、圧縮データに含まれる識別子に応じて伸長処理を行う。伸長変換処理は、識別子が最長一致データに基づく圧縮データでない旨を示す識別子（図２の例では「０」）である場合、圧縮データの１文字を伸長し、伸長した１文字を記憶領域Ａ２および記憶領域Ａ３に格納する。ここでは、識別子が「０」であるので、文字コードそのものの「Ｅ２ｈ」（０ｘＥ２）が記憶領域Ａ２および記憶領域Ａ３に格納される。そして、伸長変換処理は、格納された文字コードの長さを格納長として一次領域Ｌ１に格納する。ここでは、一次領域Ｌ１には、１バイトであることを示す「１」が格納される。そして、伸長変換処理は、ポインタＰＢ１およびポインタＰＡ２の内容を更新する。
【００３８】
次に、図４Ｂに示すように、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトを用いて、１文字に対応する文字コードの長さを文字長として取得する。文字長は、一例として、先頭バイトと文字長との対応関係を記憶する対応関係テーブルに基づいて取得される。伸長変換処理は、取得した文字長を一次領域Ｌ２に格納する。ここでは、先頭バイトが「Ｅ２」であるので、文字長として３バイトであることを示す「３」が一次領域Ｌ２に格納される。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。伸長変換処理は、取得した文字長以上であると判定した場合、取得した文字長までの伸長データを記憶領域Ａ４に格納する。一方、伸長変換処理は、取得した文字長以上でないと判定した場合、次の伸長処理に移行する。ここでは、記憶領域Ａ３に記憶された伸長データの長さは一時領域Ｌ１に記憶された「１」であり、文字長は一次領域Ｌ２に記憶された「３」であるので、記憶領域Ａ３に記憶された伸長データの長さは文字長以上でないと判定される。そこで、伸長変換処理は、次の伸長処理に移行する。
【００３９】
次に、図４Ｃに示すように、伸長変換処理は、記憶領域Ｂ１の圧縮データ「０ｂＢＣｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。そして、伸長変換処理は、読み出した圧縮データについて、圧縮データに含まれる識別子に応じて伸長処理を行う。ここでは、識別子が「０」であるので、文字コードそのものの「ＢＣｈ」（０ｘＢＣ）が記憶領域Ａ２および記憶領域Ａ３に格納される。そして、伸長変換処理は、記憶領域Ａ３に格納されている文字コードの長さを一次領域Ｌ１に格納する。ここでは、一次領域Ｌ１には、前回の１バイトと今回の１バイトとから２バイトであることを示す「２」が格納される。そして、伸長変換処理は、ポインタＰＢ１およびポインタＰＡ２の内容を更新する。
【００４０】
次に、図４Ｄに示すように、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトを用いて、１文字に対応する文字コードの長さを文字長として取得する。伸長変換処理は、取得した文字長を一次領域Ｌ２に格納する。ここでは、先頭バイトが「Ｅ２」であるので、文字長として３バイトであることを示す「３」が一次領域Ｌ２に格納される。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。ここでは、記憶領域Ａ３に記憶された伸長データの長さは一時領域Ｌ１に記憶された「２」であり、文字長は一次領域Ｌ２に記憶された「３」であるので、記憶領域Ａ３に記憶された伸長データの長さは文字長以上でないと判定される。そこで、伸長変換処理は、次の伸長処理に移行する。
【００４１】
次に、図４Ｅに示すように、伸長変換処理は、記憶領域Ｂ１の圧縮データ「０ｂ９８ｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。そして、伸長変換処理は、読み出した圧縮データについて、圧縮データに含まれる識別子に応じて伸長処理を行う。ここでは、識別子が「０」であるので、文字コードそのものの「９８ｈ」（０ｘ９８）が記憶領域Ａ２および記憶領域Ａ３に格納される。そして、伸長変換処理は、記憶領域Ａ３に格納されたトータルの文字コードの長さを一次領域Ｌ１に格納する。ここでは、一次領域Ｌ１には、前回の２バイトと今回の１バイトとから３バイトであることを示す「３」が格納される。そして、伸長変換処理は、ポインタＰＢ１およびポインタＰＡ２の内容を更新する。
【００４２】
次に、図４Ｆに示すように、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトを用いて、１文字に対応する文字コードの長さを文字長として取得する。伸長変換処理は、取得した文字長を一次領域Ｌ２に格納する。ここでは、先頭バイトが「Ｅ２」であるので、文字長として３バイトであることを示す「３」が一次領域Ｌ２に格納される。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。ここでは、記憶領域Ａ３に記憶された伸長データの長さは一時領域Ｌ１に記憶された「３」であり、文字長は一次領域Ｌ２に記憶された「３」であるので、記憶領域Ａ３に記憶された伸長データの長さは文字長以上であると判定される。
【００４３】
そして、伸長変換処理は、取得した文字長以上であると判定した場合、記憶領域Ａ３の先頭から文字長分の伸長データを、記憶領域Ａ４を介して変換先の文字コードに変換する。例えば、伸長変換処理は、記憶領域Ａ３に記憶された文字コードをもとに、文字コード変換テーブルから変換先の文字コードを取得する。そして、伸長変換処理は、取得した文字コードを記憶領域Ａ４に格納する。ここでいう文字コード変換テーブルとは、文字コードの変換に用いられるテーブルである。図４Ｆには、文字「十」に対する、ＵＴＦ−８およびシフトＪＩＳ間の文字コード変換に用いられる文字コード変換テーブルの一例が示されている。ここでは、伸長変換処理は、文字長（３）分のＵＴＦ−８の「Ｅ２ＢＣ９８」をもとに、文字コード変換テーブルから変換先のシフトＪＩＳの「８Ｆ５Ｃ」を取得し、記憶領域Ａ４に格納する。
【００４４】
そして、伸長変換処理は、記憶領域Ａ４に格納された文字コードを記憶領域Ｂ２に格納する。そして、伸長変換処理は、一次領域Ｌ１に記憶された格納長を「０」に更新するとともに、記憶領域Ａ３内の変換対象となった伸長データを左にシフトする。この結果、記憶領域Ａ３には、伸長データの変換対象がクリアされる。これにより、伸長変換処理は、圧縮データを順次伸長しながら文字の区切りを判別し、文字の区切りまでの伸長データを文字コード変換することができる。
【００４５】
続いて、伸長変換処理は、繰り返し、伸長処理および変換処理を行う。そして、図４Ｇに示すように、伸長変換処理は、記憶領域Ｂ１に記憶された圧縮データのうち「十一才から」に対応する圧縮データについて、ＵＴＦ−８からシフトＪＩＳに変換した文字コードを記憶領域Ｂ２に格納する。
【００４６】
次に、図４Ｈに示すように、伸長変換処理は、記憶領域Ｂ１の圧縮データ「１ｂ００００ｈ０５ｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。伸長変換処理は、読み出した圧縮データについて、圧縮データに含まれる識別子に応じて伸長処理を行う。ここでは、伸長変換処理は、識別子が「１」であるので、圧縮データに含まれる最長一致データのデータ長および位置の情報に基づいて、記憶領域Ａ２から文字コード列を読み出し、圧縮データを伸長する。すなわち、伸長変換処理は、最長一致データのデータ長を示す「０５ｈ」、位置の情報を示す「００００ｈ」に基づいて、文字コード列「Ｅ２ＢＣ９８ｈＥ３８６ｈ」を読み出し、圧縮データを伸長する。そして、伸長変換処理は、読み出した文字列「Ｅ２ＢＣ９８ｈＥ３８６ｈ」を、記憶領域Ａ２および記憶領域Ａ３に格納する。そして、ポインタＰＢ１およびポインタＰＡ２の内容を更新する。
【００４７】
次に、図４Ｉに示すように、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトを用いて、１文字に対応する文字コードの長さを文字長として取得する。伸長変換処理は、取得した文字長を一次領域Ｌ２に格納する。ここでは、先頭バイトが「Ｅ２」であるので、文字長として３バイトであることを示す「３」が一次領域Ｌ２に格納される。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。ここでは、記憶領域Ａ３に記憶された伸長データの長さは一時領域Ｌ１に記憶された「５」であり、文字長は一次領域Ｌ２に記憶された「３」であるので、記憶領域Ａ３に記憶された伸長データの長さは文字長以上であると判定される。
【００４８】
そして、伸長変換処理は、取得した文字長以上であると判定した場合、取得した文字長までの伸長データを、記憶領域Ａ４を介して変換先の文字コードに変換する。例えば、伸長変換処理は、記憶領域Ａ３に記憶された文字コードをもとに、文字コード変換テーブルから変換先の文字を取得する。そして、伸長変換処理は、取得した文字を記憶領域Ａ４に格納する。ここでは、伸長変換処理は、文字長（３）分のＵＴＦ−８の「Ｅ２ＢＣ９８」をもとに、文字コード変換テーブルから変換先のシフトＪＩＳの「８Ｆ５Ｃ」を取得し、記憶領域Ａ４に格納する。
【００４９】
そして、伸長変換処理は、記憶領域Ａ４に格納された文字コードを記憶領域Ｂ２に格納する。そして、伸長変換処理は、一次領域Ｌ１に記憶された格納長を「２」に更新するとともに、記憶領域Ａ３内の変換対象となった伸長データを左にシフトする。この結果、記憶領域Ａ３には、「Ｅ３８６」が記憶される。これにより、伸長変換処理は、圧縮データを順次伸長しながら、文字の区切りまでの伸長データを文字コード変換することができる。
【００５０】
次に、図４Ｊに示すように、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトを用いて、１文字に対応する文字コードの長さを文字長として取得する。伸長変換処理は、取得した文字長を一次領域Ｌ２に格納する。ここでは、先頭バイトが「Ｅ３」であるので、文字長として３バイトであることを示す「３」が一次領域Ｌ２に格納される。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。ここでは、記憶領域Ａ３に記憶された伸長データの長さは一時領域Ｌ１に記憶された「２」であり、文字長は一次領域Ｌ２に記憶された「３」であるので、記憶領域Ａ３に記憶された伸長データの長さは文字長以上でないと判定される。そこで、伸長変換処理は、次の伸長処理に移行する。
【００５１】
次に、図４Ｋに示すように、伸長変換処理は、記憶領域Ｂ１の圧縮データ「０ｂ９３ｈ」を、ポインタＰＢ１を介して、記憶領域Ａ１に読み出す。そして、伸長変換処理は、読み出した圧縮データについて、圧縮データに含まれる識別子に応じて伸長処理を行う。ここでは、識別子が「０」であるので、文字コードそのものの「９３ｈ」（０ｘ９３）が記憶領域Ａ２および記憶領域Ａ３に格納される。そして、伸長変換処理は、記憶領域Ａ３に格納されたトータルの文字コードの長さを一次領域Ｌ１に格納する。ここでは、一次領域Ｌ１には、前回の２バイトと今回の１バイトとから３バイトであることを示す「３」が格納される。そして、伸長変換処理は、ポインタＰＢ１およびポインタＰＡ２の内容を更新する。
【００５２】
次に、図４Ｌに示すように、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの先頭バイトを用いて、１文字に対応する文字コードの長さを文字長として取得する。伸長変換処理は、取得した文字長を一次領域Ｌ２に格納する。ここでは、先頭バイトが「Ｅ３」であるので、文字長として３バイトであることを示す「３」が一次領域Ｌ２に格納される。そして、伸長変換処理は、記憶領域Ａ３に記憶された伸長データの長さが、取得した文字長以上であるか否かを判定する。ここでは、記憶領域Ａ３に記憶された伸長データの長さは一時領域Ｌ１に記憶された「３」であり、文字長は一次領域Ｌ２に記憶された「３」であるので、記憶領域Ａ３に記憶された伸長データの長さは文字長以上であると判定される。
【００５３】
そして、伸長変換処理は、取得した文字長以上であると判定した場合、取得した文字長までの伸長データを、記憶領域Ａ４を介して変換先の文字コードに変換する。例えば、伸長変換処理は、記憶領域Ａ３に記憶された文字コードをもとに、文字コード変換テーブルから変換先の文字を取得する。そして、伸長変換処理は、取得した文字を記憶領域Ａ４に格納する。ここでは、伸長変換処理は、文字長（３）分のＵＴＦ−８の「Ｅ３８６９３」をもとに、文字コード変換テーブルから変換先のシフトＪＩＳの「９３Ｆ１」を取得し、記憶領域Ａ４に格納する。
【００５４】
そして、伸長変換処理は、記憶領域Ａ４に格納された文字コードを記憶領域Ｂ２に格納する。そして、伸長変換処理は、一次領域Ｌ１に記憶された格納長を「０」に更新するとともに、記憶領域Ａ３内の変換対象となった伸長データを左にシフトする。この結果、記憶領域Ａ３には、伸長データの変換対象がクリアされる。
【００５５】
その後、圧縮データが全て伸長されると、伸長変換処理は、記憶領域Ｂ２に記憶された変換データに基づいて、ファイルＦ２を生成する。これにより、伸長変換処理は、バイト単位で伸長するが、伸長データの文字の区切りを判別して文字の区切りまでの伸長データを文字コード変換し、変換データとして記憶領域Ｂ２に格納するので、全ての伸長結果を蓄積する記憶領域分を減らすことができる。また、伸長変換処理は、全ての伸長データを記憶領域に蓄積したり、当該記憶領域から伸長データを読み出したりしないで、文字コード変換処理を実現できるので、処理時間が短縮できる。
【００５６】
［参考例に係る伸長装置の機能構成］
次に、図５を参照して、ＬＺ７７７系を利用した参考例に係る伸長変換処理を実行する伸長装置の機能構成について説明する。図５は、伸長装置の機能構成の第１の例を示す図である。図５に示すように、伸長装置１００は、制御部１１０と記憶部１２０とを有する。
【００５７】
制御部１１０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、制御部１１０は、例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）などの集積回路の電子回路に対応する。または、制御部１１０は、ＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路に対応する。また、制御部１１０は、ファイルリード部１１１、圧縮符号判定部１１２、１文字伸長部１１３、最長一致文字列伸長部１１４、参照部更新部１１５、ライトバッファ更新部１１６、文字切り出し変換部１１７およびファイルライト部１１８を有する。
【００５８】
記憶部１２０は、例えばフラッシュメモリ（Flash  Memory）やＦＲＡＭ（登録商標）（Ferroelectric  Random  Access  Memory）などの不揮発性の半導体メモリ素子などの記憶装置に対応する。記憶部１２０には、圧縮処理により得られる圧縮データを記憶するファイルＦ１や、ファイルＦ１に記憶された圧縮データを伸長および変換して得られるファイルＦ２が格納される。また、記憶部１２０は、制御部１１０のワークエリアとして用いられる。
【００５９】
制御部１１０は、各機能部を制御して、伸長処理および変換処理を実現する。制御部１１０は、各機能部の処理に用いるデータを保持するため、記憶部１２０に記憶領域を確保する。記憶領域は、例えば、上述の記憶領域Ａ１、Ａ２、およびＢ１、Ｂ２、Ｂ３などである。なお、以降では、記憶領域Ａ１、Ａ２、およびＢ１、Ｂ２、Ｂ３を、それぞれ、符号化部、参照部、リードバッファ、ライトバッファ、変換後バッファとして説明する。
【００６０】
ファイルリード部１１１は、圧縮データを記憶するファイルＦ１から圧縮データを読み出し、記憶部１２０に確保されたリードバッファに格納する。
【００６１】
圧縮符号判定部１１２は、リードバッファ内の読み出し位置の圧縮符号を読み出し、読み出した圧縮符号に含まれる識別子を判定する。
【００６２】
１文字伸長部１１３は、識別子が最長一致データに基づく圧縮符号でない旨を示す識別子であると判定された場合、圧縮符号の１文字を伸長する。
【００６３】
最長一致文字列伸長部１１４は、識別子が最長一致データに基づく圧縮符号である旨を示す識別子であると判定された場合、圧縮符号に基づいて最長一致文字列に伸長する。例えば、最長一致文字列伸長部１１４は、圧縮符号に含まれる最長一致データのデータ長および位置の情報に基づいて、参照部から文字コード列を読み出す。
【００６４】
参照部更新部１１５は、１文字伸長部１１３によって伸長された１文字の文字コードを参照部に格納し、参照部を更新する。参照部更新部１１５は、最長一致文字列伸長部１１４によって伸長された文字コード列を参照部に格納し、参照部を更新する。
【００６５】
ライトバッファ更新部１１６は、１文字伸長部１１３によって伸長された１文字の文字コードをライトバッファに格納し、ライトバッファを更新する。ライトバッファ更新部１１６は、最長一致文字列伸長部１１４によって伸長された文字コード列をライトバッファに格納し、ライトバッファを更新する。例えば、ライトバッファ更新部１１６は、既にライトバッファに記憶されている文字コード列の後ろに、今回伸長された１文字の文字コードまたは文字コード列を格納する。
【００６６】
文字切り出し変換部１１７は、圧縮データが全て伸長されると、ライトバッファから１文字に対応する文字コード列を順次切り出す。そして、文字切り出し変換部１１７は、切り出した文字コード列を、送信先で用いられる文字コード系の文字コード列に変換する。そして、文字切り出し変換部１１７は、変換した文字コード列を変換後バッファに格納する。
【００６７】
ファイルライト部１１８は、変換後バッファに記憶された変換後の変換データをファイルＦ２に書き込む。これにより、伸長装置１００は、圧縮データ全体を伸長した後、伸長後の伸長データに対して文字コード変換するので、ライトバッファと変換後バッファとを要することとなり、記憶領域を抑制することができない。また、伸長装置１００は、伸長処理に用いられるライトバッファへのＩ／Ｏが発生するため、文字コード変換処理を含む伸長処理の処理時間が長くなる。
【００６８】
［実施例に係る伸長装置の機能構成］
次に、図６を参照して、実施例に係る伸長変換処理を実行する伸長装置の機能構成について説明する。図６は、伸長装置の機能構成の第２の例を示す図である。図６に示すように、伸長装置１は、制御部１０と記憶部２０とを有する。
【００６９】
制御部１０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、制御部１０は、例えば、ＡＳＩＣやＦＰＧＡなどの集積回路の電子回路に対応する。または、制御部１０は、ＣＰＵやＭＰＵなどの電子回路に対応する。また、制御部１１は、ファイルリード部１１、圧縮符号判定部１２、１文字伸長部１３、最長一致文字列伸長部１４、参照部更新部１５、中間伸長部更新部１６、文字コード変換部１７、ライトバッファ更新部１８およびファイルライト部１９を有する。
【００７０】
記憶部２０は、例えばフラッシュメモリやＦＲＡＭなどの不揮発性の半導体メモリ素子などの記憶装置に対応する。記憶部２０には、圧縮処理により得られる圧縮データを記憶するファイルＦ１や、ファイルＦ１に記憶された圧縮データを伸長および変換して得られるファイルＦ２が格納される。例えば、記憶部２０は、文字コード変換テーブル２１および対応関係テーブル２２を記憶する。また、記憶部２０は、制御部１０のワークエリアとして用いられる。
【００７１】
文字コード変換テーブル２１は、文字コードの変換に用いられる。文字コード変換テーブル２１は、文字毎に変換元の文字コードのデータ列と変換先の文字コードのデータ列とを対応付けて記憶する。なお、文字コード変換テーブル２１のデータ構造は、後述する。
【００７２】
対応関係テーブル２２は、文字の先頭バイトの文字コードと文字の文字コードの長さを示す文字長との対応関係を記憶する。一例として、文字コード系がＵＴＦ−８である場合、先頭バイトの文字コードが「Ｅ３」であるとき、文字長として「３」（バイト）と記憶している。また、先頭バイトの文字コードが「Ｅ２」であるとき、文字長として「３」（バイト）と記憶している。
【００７３】
制御部１０は、各機能部を制御して、伸長処理および変換処理を実現する。制御部１０は、各機能部の処理に用いるデータを保持するため、記憶部２０に記憶領域を確保する。記憶領域は、例えば、上述の記憶領域Ａ１〜Ａ４およびＢ１、Ｂ２などである。なお、以降では、記憶領域Ａ１〜Ａ４を、それぞれ、符号化部、参照部、中間伸長部、文字変換部として説明する。記憶領域Ｂ１、Ｂ２を、それぞれ、リードバッファ、ライトバッファとして説明する。
【００７４】
ファイルリード部１１は、圧縮データを記憶するファイルＦ１から圧縮データを読み出し、記憶部２０に確保されたリードバッファに格納する。例えば、ファイルリード部１１は、指定されたファイルＦ１の伸長変換処理が呼び出されると、当該ファイルＦ１から圧縮データを読み出す。そして、ファイルリード部１１は、読み出した圧縮データをリードバッファに格納する。なお、ファイルリード部１１は、伸長変換処理の呼び出しがされる際、送信先で用いられる文字コード系を取得する。
【００７５】
圧縮符号判定部１２は、リードバッファ内の読み出し位置の圧縮符号を読み出し、読み出した圧縮符号に含まれる識別子を判定する。例えば、圧縮符号判定部１２は、読み出し位置の圧縮符号に含まれる識別子が最長一致データに基づく圧縮符号でない旨を示す識別子であるか、当該識別子が最長一致データに基づく圧縮符号である旨を示す識別子であるかを判定する。一例として、圧縮符号が「０ｂＥ２ｈ」である場合、圧縮符号の先頭に含まれる識別子が「０」であるので、当該識別子は、最長一致データに基づく圧縮符号でない旨を示す識別子であると判定される。別の例として、圧縮符号が「１ｂ００００ｈ０５ｈ」である場合、圧縮符号の先頭に含まれる識別子が「１」であるので、当該識別子は、最長一致データに基づく圧縮符号である旨を示す識別子であると判定される。
【００７６】
１文字伸長部１３は、識別子が最長一致データに基づく圧縮符号でない旨を示す識別子であると判定された場合、圧縮符号の１文字を伸長する。例えば、１文字伸長部１３は、識別子が「０」であると判定された場合、圧縮符号に含まれる文字コードそのものを伸長する。一例として、圧縮符号が「０ｂＥ２ｈ」である場合、「Ｅ２ｈ」が伸長されたコードとして取得される。
【００７７】
最長一致文字列伸長部１４は、識別子が最長一致データに基づく圧縮符号である旨を示す識別子であると判定された場合、圧縮符号に基づいて最長一致文字列に伸長する。例えば、最長一致文字列伸長部１４は、識別子が「１」であると判定された場合、圧縮符号に含まれる最長一致データのデータ長および位置の情報に基づいて、参照部から文字コード列を読み出す。一例として、圧縮符号が「１ｂ００００ｈ０５ｈ」である場合、参照部の位置「００００ｈ」からデータ長「０５ｈ」分の文字コード列が読み出される。
【００７８】
参照部更新部１５は、１文字伸長部１３によって伸長された１文字の文字コードを参照部に格納し、参照部を更新する。参照部更新部１５は、最長一致文字列伸長部１４によって伸長された文字コード列を参照部に格納し、参照部を更新する。
【００７９】
中間伸長部更新部１６は、中間伸長部を更新する。例えば、中間伸長部更新部１６は、１文字伸長部１３によって伸長された１文字の文字コードを中間伸長部に格納し、中間伸長部を更新する。また、中間伸長部更新部１６は、最長一致文字列伸長部１４によって伸長された文字コード列を中間伸長部に格納し、中間伸長部を更新する。また、中間伸長部更新部１６は、中間伸長部の先頭バイトをもとに、対応関係テーブル２２から文字長を取得する。また、中間伸長部更新部１６は、中間伸長部に記憶された伸長データの長さが文字長以上であるか否かを判定する。中間伸長部更新部１６は、中間伸長部に記憶された伸長データの長さが文字長以上であると判定した場合、文字の区切りを検知し、中間伸長部の先頭から文字長分の伸長データを変換対象とする。なお、中間伸長部更新部１６は、中間伸長部に記憶された伸長データの長さが文字長以上でないと判定した場合、文字の区切りを検知できず、次の圧縮符号の伸長処理に移行する。
【００８０】
文字コード変換部１７は、伸長データの文字コードを変換する。例えば、文字コード変換部１７は、中間伸長部更新部１６によって変換対象とされた伸長データの文字コードをもとに、文字コード変換テーブル２１から、変換先の文字コード系の文字コードを取得する。そして、文字コード変換部１７は、取得した文字コードを文字変換部に格納する。
【００８１】
ライトバッファ更新部１８は、文字コード変換部１７によって変換された文字コードを変換データとしてライトバッファに格納し、ライトバッファを更新する。例えば、ライトバッファ更新部１８は、既にライトバッファに記憶されている文字コードの後ろに、今回変換された文字コードを格納する。
【００８２】
ファイルライト部１９は、ライトバッファに記憶された変換後の変換データをファイルＦ２に書き込む。これにより、伸長装置１は、バイト単位で伸長するが、伸長データの文字の区切りを判別して文字の区切りまでの伸長データを文字コード変換し、ライトバッファに格納するので、伸長データを蓄積する記憶領域を減らすことができる。また、伸長装置１は、全ての伸長データを記憶領域に蓄積したり、当該記憶領域から伸長データを読み出したりしないで、文字コード変換処理を実現できるので、処理時間が短縮できる。
【００８３】
［文字コード変換テーブルのデータ構造］
次に、図７を参照して、文字コード変換テーブルのデータ構造について説明する。図７は、文字コード変換テーブル２１のデータ構造の一例を示す図である。図７に示すように、文字コード変換テーブル２１は、ＵＴＦ−８の文字コード２１ａとシフトＪＩＳの文字コード２１ｂとを対応付けて記憶する。ＵＴＦ−８の文字コード２１ａは、文字コード系がＵＴＦ−８である場合の１文字に対応する文字コードのデータ列である。シフトＪＩＳの文字コード２１ｂは、文字コード系がシフトＪＩＳである場合の１文字に対応する文字コードのデータ列である。一例として、文字が「十」である場合、ＵＴＦ−８の文字コード２１ａとして「Ｅ２ＢＣ９８ｈ」、シフトＪＩＳの文字コード２１ｂとして「８Ｆ５Ｃｈ」と記憶している。なお、図７の例では、文字コード変換テーブル２１は、ＵＴＦ−８の文字コードとシフトＪＩＳの文字コードとの対応付けとしたが、これに限定されず、異なる文字コード系の対応付けであれば良い。
【００８４】
［伸長変換処理のフローチャート］
次に、図８を参照して、伸長変換処理の手順を説明する。図８は、伸長変換処理のフローチャートを示す図である。
【００８５】
まず、伸長装置１内のオペレーティング・システムやアプリケーションプログラムの動作により伸長変換処理が呼び出される。伸長変換処理が呼び出されると、制御部１０は、前処理を実行する（ステップＳ１１）。例えば、制御部１０は、図４Ａに示す記憶領域Ａ１〜Ａ４および記憶領域Ｂ１、Ｂ２を確保する。また、制御部１０は、各記憶領域内の各位置情報（例えば、図４Ａに示す各ポインタ）を設定する。なお、下記の説明では、記憶領域Ａ１〜Ａ４を、それぞれ、例えば、符号化部、参照部、中間伸長部、文字変換部とする。記憶領域Ｂ１、Ｂ２を、それぞれ、例えば、リードバッファ、ライトバッファとする。ポインタＰＢ１、ＰＢ２、ＰＡ２を、それぞれ、例えば、ライトポインタ、リードポインタ、末尾ポインタとする。
【００８６】
そして、ファイルリード部１１は、ファイルＦ１に記憶された圧縮データをリードバッファにリードする（ステップＳ１２）。
【００８７】
そして、圧縮符号判定部１２は、リードバッファから次の圧縮符号を読み出す（ステップＳ１３）。例えば、圧縮符号判定部１２は、リードバッファから、リードポインタが指す読み出し位置の圧縮符号を読み出す。そして、圧縮符号判定部１２は、読み出した圧縮符号の識別子が最長一致データに基づく圧縮符号でない旨を示す識別子（「０」）であるか否かを判定する（ステップＳ１４）。
【００８８】
識別子が「０」である場合（ステップＳ１４；Ｙｅｓ）、１文字伸長部１３は、読み出した圧縮符号に含まれている１文字の文字コードを読み出す。参照部更新部１５は、読み出した文字コードを参照部に格納する（ステップＳ１５）。そして、伸長変換処理は、ステップＳ１８に移行する。
【００８９】
一方、識別子が「０」でない場合（ステップＳ１４；Ｎｏ）、最長一致文字列伸長部１４は、読み出した圧縮符号に含まれるデータ長および位置に基づき、最長一致文字列を伸長する（ステップＳ１６）。例えば、最長一致文字列伸長部１４は、参照部の位置からデータ長分の文字コード列を読み出し、最長一致文字列を伸長する。そして、参照部更新部１５は、伸長した最長一致文字列の文字コードを参照部に格納する（ステップＳ１７）。そして、伸長変換処理は、ステップＳ１８に移行する。
【００９０】
ステップＳ１８では、中間伸長部更新部１６は、文字コードを中間伸長部に格納し、格納長を設定する（ステップＳ１８）。例えば、中間伸長部更新部１６は、１文字伸長部１３によって伸長された１文字の文字コードを中間伸長部に格納し、中間伸長部を更新する。中間伸長部更新部１６は、最長一致文字列伸長部１４によって伸長された最長一致文字列の文字コードを中間伸長部に格納し、中間伸長部を更新する。そして、中間伸長部更新部１６は、中間伸長部に格納されている文字コードの長さを格納長として一次領域に設定する。そして、中間伸長部更新部１６は、リードバッファのリードポインタおよび参照部の末尾ポインタの内容を更新する。
【００９１】
続いて、中間伸長部更新部１６は、中間伸長部の先頭バイトをもとに文字長を判別する（ステップＳ１９）。例えば、中間伸長部更新部１６は、中間伸長部の先頭バイトをもとに、対応関係テーブル２２から文字長を取得する。一例として、文字コード系がＵＴＦ−８の場合、先頭バイトが「Ｅ３」であれば、対応関係から文字長として３バイトであることを示す「３」が取得される。
【００９２】
そして、中間伸長部更新部１６は、格納長が文字長以上であるか否かを判定する（ステップＳ２０）。格納長が文字長以上でない場合（ステップＳ２０；Ｎｏ）、文字コード変換部１７は、次の圧縮符号を処理すべく、ステップＳ１３に移行する。
【００９３】
一方、格納長が文字長以上である場合（ステップＳ２０；Ｙｅｓ）、文字コード変換部１７は、中間伸長部の文字長分の文字列の文字コードをもとに、変換先の文字コード系の文字コードに変換する（ステップＳ２１）。例えば、文字コード変換部１７は、中間伸長部の先頭から文字長分の文字コード列をもとに、文字コード変換テーブル２１から、変換先の文字コード系の文字コード列を取得する。そして、文字コード変換部１７は、取得した文字コード列を文字変換部に格納する。
【００９４】
そして、ライトバッファ更新部１８は、文字変換部に格納された文字コード列をライトバッファに格納し、ライトバッファを更新する（ステップＳ２２）。例えば、ライトバッファ更新部１８は、既にライトバッファに記憶されている文字コード列の後ろに、文字変換部に格納された文字コード列を格納する。
【００９５】
そして、ライトバッファ更新部１８は、中間伸長部に記憶されている文字列の文字コード列を、変換が完了した文字長分だけ左にシフトする（ステップＳ２３）。そして、ライトバッファ更新部１８は、現在一次領域に設定されている格納長から文字長を引いて、新たな格納長を算出する（ステップＳ２４）。すなわち、ライトバッファ更新部１８は、中間伸長部に格納されている文字コードの長さを格納長として算出する。
【００９６】
続いて、圧縮符号判定部１２は、全ての圧縮符号を処理したか否かを判定する（ステップＳ２５）。全ての圧縮符号を処理していないと判定した場合（ステップＳ２５；Ｎｏ）、圧縮符号判定部１２は、次の圧縮符号を処理すべく、ステップＳ１３に移行する。
【００９７】
一方、全ての圧縮符号を処理したと判定した場合（ステップＳ２５；Ｙｅｓ）、ファイルライト部１９は、ライトバッファに記憶された変換データをファイルＦ２へ書き込む（ステップＳ２６）。これにより、伸長変換処理は、終了する。
【００９８】
［実施例の効果］
上記実施例によれば、伸長装置１は、圧縮された符号列を文字の区切りを認識しないで伸長する場合に、符号列内の符号を伸長して得られたデータ列を中間伸長部に蓄積する。そして、伸長装置１は、中間伸長部に蓄積されたデータ列に第１の文字コードの文字を認識すると、認識した文字のデータ列を第２の文字コードのデータ列に変換する。かかる構成によれば、伸長装置１は、圧縮された符号列を文字の区切りを認識しないで伸長するが、伸長して得られたデータ列のうち文字と認識されたデータ列を文字コード変換するので、伸長処理に用いられる記憶領域の無駄をなくすことができるとともに、処理時間を短縮できる。
【００９９】
また、上記実施例によれば、伸長装置１は、第１の符号を、スライド窓を用いて最長一致となる特定の固まりのバイト列を示すデータ列に伸長し、伸長したデータ列を中間伸長部に蓄積する。そして、伸長装置１は、第１の符号を伸長したタイミングで、中間伸長部に蓄積されたデータ列に第１の文字コードの文字を認識するか否かを判定する。そして、伸長装置１は、中間伸長部に蓄積されたデータ列に第１の文字コードの文字を認識すると判定された場合に、認識した文字のデータ列を第２の文字コードのデータ列に変換する。かかる構成によれば、伸長装置１は、伸長したタイミングで、伸長して得られたデータ列に文字を認識するか否かを判定して、文字と認識されたデータ列を文字コード変換するので、伸長処理に用いられる記憶領域の無駄をなくすことができる。
【０１００】
また、上記実施例によれば、伸長装置１は、文字の先頭バイトの文字コードと文字の文字コードの長さを示す文字長との対応関係に基づいて、記憶領域に蓄積された伸長データ列の先頭バイトの文字コードに対応する文字長を取得する。そして、伸長装置１は、記憶領域に記憶された伸長データ列の長さが、文字長以上であるか否かを判定する。そして、伸長装置１は、文字長以上であると判定された場合、伸長データ列の先頭から文字長分の伸長データ列を第２の文字コードのデータ列に変換する。かかる構成によれば、伸長装置１は、文字の先頭バイトの文字コードと文字の文字長との対応関係を用いるので、伸長データ列の文字の区切りを検知できる。この結果、伸長装置１は、圧縮された符号列を伸長しながら、伸長データ列の文字の区切りまでの文字コード変換を実現できる。
【０１０１】
また、上記実施例によれば、伸長装置１は、伸長データ列の先頭から文字長分の伸長データ列を送信先で用いられる文字コードに変換するとともに、伸長データ列の先頭から文字長分の伸長データ列を処理済みのデータ列として左シフトする。かかる構成によれば、伸長装置１は、変換した部分の伸長データ列の次から変換対象とすることができ、圧縮された符号列を伸長しながら効率的に変換処理をすることができる。
【０１０２】
また、上記実施例によれば、伸長装置１は、文字毎に変換元の文字コードと変換先の文字コードとを対応付けた変換情報であって、変換元および変換先の組毎の複数の変換情報から、変換元および変換先に応じた変換情報を選択する。そして、伸長装置１は、選択した変換情報を用いて、伸長データ列の先頭から文字長分の伸長データ列を変換先の文字コードに変換する。かかる構成によれば、伸長装置１は、変換元および変換先に応じた変換情報を用いて、変換元から変換先の文字コードに変換するので、圧縮されたデータを文字コード変換して送信先に転送する場合に、汎用的に使用することができる。
【０１０３】
［実施例に関連する他の態様］
以下、上述の実施形態における変形例の一部を説明する。下記の変形例のみでなく、本発明の本旨を逸脱しない範囲の設計変更は適宜行われうる。
【０１０４】
実施例において、文字コード変換テーブル２１は、異なる文字コード系の対応付けであるとして説明した。すなわち、文字コード変換テーブル２１は、例えば、ＵＴＦ−８の文字コードのデータ列とシフトＪＩＳの文字コードのデータ列との対応付けとして説明した。しかしながら、文字コード変換テーブル２１は、これに限定されず、変換元の文字コードおよび変換先の文字コードを組として複数存在しても良い。複数存在する場合、文字コード変換部１７は、複数の文字コード変換テーブル２１から、変換元の文字コードおよび変換先の文字コードに応じた文字コード変換テーブル２１を選択する。そして、文字コード変換部１７は、選択した文字コード変換テーブル２１を用いて、伸長データ列の先頭から文字長分の伸長データ列を変換先の文字コードのデータ列に変換するようにすれば良い。
【０１０５】
また、実施例において、図示した装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、１文字伸長部１３と参照部更新部１５、最長一致文字列伸長部１４と参照部更新部１５とをそれぞれ１個の部として統合しても良い。一方、中間伸長部更新部１６を、中間伸長部を更新する更新部と、文字長を取得する取得部と、伸長データの長さが文字長以上であるか否かを判定する判定部とに分散しても良い。また、記憶部２０を伸長装置１の外部装置に記憶するようにしても良いし、記憶部２０を記憶した外部装置を伸長装置１とネットワーク経由で接続するようにしても良い。
【０１０６】
［伸長装置のハードウェア構成］
図９は、伸長装置のハードウェア構成を示す図である。図９が示すように、コンピュータ５００は、各種演算処理を実行するＣＰＵ５０１と、ユーザからのデータ入力を受け付ける入力装置５０２と、モニタ５０３とを有する。また、コンピュータ５００は、記憶媒体からプログラムなどを読み取る媒体読取装置５０４と、他の装置と接続するためのインターフェース装置５０５と、他の装置と無線により接続するための無線通信装置５０６とを有する。また、コンピュータ５００は、各種情報を一時記憶するＲＡＭ（Random  Access  Memory）５０７と、ハードディスク装置５０８とを有する。また、各装置５０１〜５０８は、バス５０９に接続される。
【０１０７】
ハードディスク装置５０８には、図６に示した制御部１０の各処理部と同様の機能を有する伸長プログラムが記憶される。もしくは、ハードディスク装置５０８には、図５に示した制御部１１０の各処理部と同様の機能を有する伸長プログラムが記憶される。また、ハードディスク装置５０８には、伸長プログラムを実現するための各種データが記憶される。
【０１０８】
ＣＰＵ５０１は、ハードディスク装置５０８に記憶された各プログラムを読み出して、ＲＡＭ５０７に展開して実行することで、各種の処理を行う。これらのプログラムは、コンピュータ５００を図６に示した制御部１０として機能させることができる。もしくは、これらのプログラムは、コンピュータ５００を図５に示した制御部１１０として機能させることができる。
【０１０９】
なお、上記の伸長プログラムは、必ずしもハードディスク装置５０８に記憶されている必要はない。例えば、コンピュータ５００が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ５００が読み出して実行するようにしてもよい。コンピュータ５００が読み取り可能な記憶媒体は、例えば、ＣＤ−ＲＯＭやＤＶＤディスク、ＵＳＢ（Universal  Serial  Bus）メモリなどの可搬型記録媒体、フラッシュメモリなどの半導体メモリ、ハードディスクドライブなどが対応する。また、公衆回線、インターネット、ＬＡＮ（Local  Area  Network）などに接続された装置にこのプログラムを記憶させておき、コンピュータ５００がこれらからプログラムを読み出して実行するようにしても良い。
【符号の説明】
【０１１０】
１，１００  伸長装置
１０，１１０  制御部
１１，１１１  ファイルリード部
１２，１１２  圧縮符号判定部
１３，１１３  １文字伸長部
１４，１１４  最長一致文字列伸長部
１５，１１５  参照部更新部
１６  中間伸長部更新部
１７  文字コード変換部
１８，１１６  ライトバッファ更新部
１９，１１８  ファイルライト部
２０，１２０  記憶部
１１７  文字切り出し変換部
２１  文字コード変換テーブル
２２  対応関係テーブル
【図１Ａ】
0006476618.tif 000002
【図１Ｂ】
0006476618.tif 000003
【図２Ａ】
0006476618.tif 000004
【図２Ｂ】
0006476618.tif 000005
【図２Ｃ】
0006476618.tif 000006
【図２Ｄ】
0006476618.tif 000007
【図２Ｅ】
0006476618.tif 000008
【図２Ｆ】
0006476618.tif 000009
【図３Ａ】
0006476618.tif 000010
【図３Ｂ】
0006476618.tif 000011
【図４Ａ】
0006476618.tif 000012
【図４Ｂ】
0006476618.tif 000013
【図４Ｃ】
0006476618.tif 000014
【図４Ｄ】
0006476618.tif 000015
【図４Ｅ】
0006476618.tif 000016
【図４Ｆ】
0006476618.tif 000017
【図４Ｇ】
0006476618.tif 000018
【図４Ｈ】
0006476618.tif 000019
【図４Ｉ】
0006476618.tif 000020
【図４Ｊ】
0006476618.tif 000021
【図４Ｋ】
0006476618.tif 000022
【図４Ｌ】
0006476618.tif 000023
【図５】
0006476618.tif 000024
【図６】
0006476618.tif 000025
【図７】
0006476618.tif 000026
【図８】
0006476618.tif 000027
【図９】
0006476618.tif 000028