Unicodeテキストファイル圧縮変換ツール
uc - Unicode Text File Converter with Standard Unicode Compression

ダウンロード

概要

これまでのあらすじ

―― 夏だ!海だ!Unicode圧縮だ!

解説

使いかた

 実行ファイルをパスの通ったフォルダに置くだけで使えます。
 よくわからない場合はとりあえず作業用フォルダにテキストファイルと一緒に置いておけば大丈夫です。一方ロシアはC:\Windowsに放り込んだ。
 レジストリ等は使っていないので不要になったらいつでも削除可能です。

 何も指定せずに実行すると以下のように使い方が表示されます。


  1. Unicodeテキストファイル圧縮変換 Version 0.01
  2. 使用法: UC [動作指定] 入力ファイル名 [出力ファイル名]
  3. 動作指定:
  4. -W,-16 UTF-16LE(BOMあり, CRLF改行, 編集可)に変換する (デフォルト)
  5. -U,-8 UTF-8 (BOMあり, CRLF改行, 編集可)に変換する (サイズ増)
  6. -S,-932 可能ならシフトJIS(CRLF改行, 編集可)に変換する
  7. -数値 可能なら指定コードページ (CRLF改行)に変換する
  8. -C SCSU (BOMあり, LF改行, 文字圧縮)に変換する
  9. -B BOCU-1 (BOMあり, LF改行, 文字圧縮)に変換する
  10. -N,-8N UTF-8N (LF改行)に変換する (サイズ増)
  11. 他の指定後 -N (LF改行)に変換する
  12. -X 変換できない文字があっても出力する (文字化け注意)
  13. -I iconv互換のEUC-JP変換規則を使用する (文字化け注意)
  14. 入力ファイルの文字コードは自動判別します (SJIS/EUC-JP/UTF-8N/各種BOM)
  15. 出力ファイル名省略時はファイル名を自動生成します (末尾に.txt等を追加)

 出力されるファイルのタイムスタンプは入力ファイル名と同じ時刻に設定されます。

UTF-16LE(Unicode)への変換

 入力ファイル名のみを指定した場合、指定したテキストファイルがUTF-16リトルエンディアン(UTF-16LE)に変換され、入力ファイル名の末尾に「.txt」を追加したファイル名が生成されます。

変換の実行例
uc sjis.txt
 入力ファイルsjis.txtをUnicodeに変換し、UTF-16LE形式でsjis.txt.txtに出力します。

 この文字コード(UTF-16LE)は、メモ帳などで「Unicode」を選んだ時に使用されているものと同一の文字コードです。これはWindows内部APIで使用されている文字コードと同じであり、アプリケーションの動作中にメモリ上に展開された状態に近いデータとなります。Windows上において、文字コード変換などのオーバーヘッド一切なしで最速で扱うことができるデータです。

Unicodeデータ圧縮

 Unicodeの標準圧縮方式、Standard Compression Scheme for Unicode(SCSU)およびMIME互換Binary Ordered Compression for Unicode Profile(BOCU-1)によるテキストファイルのデータ圧縮が可能です。
 動作指定(オプション)として、-cまたは-bを指定することでデータ圧縮の変換動作を行います。
 入力ファイル名のみを指定した場合、入力ファイル名の末尾に「.SCSU」「.BOC1」を追加したファイル名が出力されるファイルの名前となります。

圧縮の実行例
uc -c sjis.txt
 入力ファイルsjis.txtをUnicodeに変換し、sjis.txt.SCSUに圧縮データを出力します。

 圧縮したデータは、アプリケーションによってはそのまま扱うこともできますが、圧縮を解きたい場合は前述のUTF-16LEなどへの変換で元データを復元できます。

解凍の実行例
uc sjis.txt.SCSU
 前述の変換の例と同様に、何もオプションを指定せずに実行するだけで元データが復元できます。
 圧縮されたファイルsjis.txt.SCSUを復元し、UTF-16LE形式でsjis.txt.SCSU.txtに元データを出力します。

 基本的な使いかたはこれだけです。SKK辞書ファイルの文字コード圧縮・変換ツールとして利用できます。

補足

入力ファイルの自動判別

 このプログラムには、SKK日本語入力FEPの文字コード拡張プラグインと同じ自動変換処理が搭載されています。入力されたテキストファイルの文字コードや改行コードの判定は自動で行われます。

 現在対応している文字コードは以下の通りです。
入力文字コード解説
SJIS (CP932)シフトJIS。アルファベットおよび半角カナを1バイト、漢字を2バイトで表現する。Windowsで標準的に使われている文字コード。古めのアプリケーションなどはこの文字コードを内部で使用しているものが多い。厳密にはシフトJISに限りなく近い呪縛的な何か。『ぼくはこの子に逆らうことができない。弱みを握られている――』
EUC-JP拡張Unixコード(EUC)。アルファベットは1バイト、漢字と半角カナを2〜3バイトで表現する。7ビット目を1にしたJISコード。SKK辞書の配布などに使われている。
UTF-16LEメモ帳のUnicode相当。Windowsの内部処理コードに限りなく近い。文字は日本語、アルファベットを問わず2バイト(ごく一部は4バイト)で表現する。
自動判定のために先頭にバイトオーダーマーク(BOM)が必須。
UTF-8メモ帳のUTF-8相当。アルファベットは1バイト、日本語の文字は3〜4バイトで表現する。変換効率は非常に悪いが、UTF-16との相互変換が容易。また、検索処理等において、マルチバイト文字を考慮していない従来のプログラムがほぼそのまま使えるといった特性を持つ。
UTF-8NUTF-8で先頭のバイトオーダーマーク(BOM)が存在しないもの。マークがないせいで、シフトJISやEUCとの判別処理が別途必要となってしまう、超まぎらわ嫌らしい形式。バイナリの達人になるとSJIS/EUC/UTF-8Nを数値の並びを見ただけで即座に判別できるようになるらしい。
SCSUUnicode標準のデータ圧縮形式。Symbian OSなどの採用事例あり。UTF-16での1文字(2バイトまたは4バイト)が高確率で1〜2バイトで表現されるため、一般的な日本語の文書であればシフトJISやEUCなどよりも小さいデータ(高い圧縮率)となる場合が多い。アルファベットと日本語文字列とが頻繁に切り替わるタイプのテキストファイル(例えばHTML文書など)と相性が良い。このため、半角スラッシュ等の文字が頻出するSKK辞書ファイルとの相性はかなり良い。
自動判定のためにBOM必須。
BOCU-1圧縮後もデータ列同士の大小関係が維持される特性を持つ、MIME互換のデータ圧縮形式。東アジア系の文字のみが連続するデータの場合、高確率で1文字が1〜2バイトで表現される。SCSUとは対極的に、アルファベットなどが混在しないタイプのテキストファイルの圧縮を得意とする。このため、残念ながらSKK辞書ファイルとの相性は最悪レベルだが、辞書用DBの検索用インデックスデータ等では絶大な威力を発揮する。
自動判定のためにBOM必須。

出力ファイルとして指定可能な文字コード

 このプログラムでは出力ファイル名の指定を省略することができます。
 省略した場合、出力ファイル名は文字コードや改行コードに応じて自動的に決定されます。
 OS標準添付のテキストエディタ(ぶっちゃけメモ帳)で編集可能な形式で出力される場合は、入力ファイル名の末尾に「.txt」を追加したものとなります。元の拡張子が「.txt」だった場合は「.txt.txt」となることに留意してください。こうして出力されたファイルは、エクスプローラのダブルクリックで即編集可能となります。
出力文字コード実行例出力ファイル名省略時
UTF-16LEuc sjis.txt.txtを追加
uc -w sjis.txt
uc -16 sjis.txt
UTF-8uc -u sjis.txt
uc -8 sjis.txt
SJISuc -s unicode.txt
uc -932 unicode.txt

 標準のメモ帳などで直接扱うことができないバイナリファイルが出力される場合は、拡張子はその文字コードを4文字で示したものとなります。
出力文字コード実行例出力ファイル名省略時
SCSUuc -c compression.txt.SCSUを追加
BOCU-1uc -b compression.txt.BOC1を追加
UTF-8N (LF)uc -n sjis.txt.UTF8を追加
UTF-16LE (LF)uc -16n sjis.txt.U16Lを追加

 出力するコードページの値を直接指定すると、さまざまな形式で出力できます。元に戻せなくなるけど。
 コードページの値はWindowsがサポートするコードページの一覧などを参照してください。
 本プログラムの特性上、多くのコードページでは正しく変換できない可能性があります。無保証ってことで。
出力文字コード実行例備考
SJISuc -0 unicode.txt日本語版WindowsではSJISと同じ
UTF-7uc -65000 broken.txtUTF-7から戻す手段がないので注意
UTF-8 (CRLF)uc -8 sjis.txtBOMあり CRLF改行 編集可能
UTF-8N (CRLF)uc -65001 sjis.txtBOMなし CRLF改行 編集可能
UTF-8N (LF)uc -8n sjis.txtBOMなし LF改行 編集不可
uc -65001n sjis.txtBOMなし LF改行 編集不可
 WindowsのEUC-JPコードページはあまりにも実状とかけ離れた文字になってしまって元に戻せなくなるので使用禁止です。
 CP20932…AD,E0バグ…うっ頭が…

EUC-JPからUnicodeへの変換について

 EUC-JPのファイルが入力された場合、このプログラムではADODB.Stream(ActiveX Data Objectsの文字コード変換処理)の動作に準じた変換が行なわれます。
 具体的には、Project X0213の変換テーブルのWindows側の値を変換表として内蔵しています。Windowsの互換性追求が産み落とした現代の生きた化石CP932との融合です。

 iconvやcveuc、CorvusSKK等、他のEUC-JP変換の実装では、上記変換表のうち特定の2文字分のみWindows側を使用しているものがあります。
 このプログラムでも、-iオプションを指定することで同じ変換表を利用することができます。
 ただし、-iオプションによる変換表を利用する場合は細心の注意が必要です。利用頻度の高いハイフンや通貨記号などがWindows内部(マルチバイト文字セット用API)で使用しているCP932に変換できない文字になってしまうため、これらの文字がファイル名やテキストファイル内に紛れ込むと、古いアプリケーションやコマンドラインのプログラム等でファイル名が指定できなかったり、古いテキストビュアー等で文字化けが発生する等の問題が発生します。ひとたび混ざったが最後、修正には大変な困難を伴うことでしょう。
 ま、そんな事を気にするような時代じゃなくなったと思うけど、過去のソフトウェア資産と決別する覚悟を決めた上で、容量用法を守って楽しくご利用ください。
 CP932と戦う者は、その過程で自分自身もCP932になることのないように気をつけなくてはならない。CP932を覗く時、CP932もまたこちらを覗いているのだ――
 つーか世の中、決別しすぎてるソフトばっかりで困った時に何とかするのがこのツールってわけ。磯野〜冥府魔道で変換しようぜ!

エンコーダの特性について

 SCSUおよびBOCU-1のエンコーダはunicode.orgのリファレンスエンコーダの仕様に囚われず、組み込み用途向けの小さなプログラムサイズを意識してゼロから作りなおしたものです。以下のような特長を持ちます。

SCSUエンコーダ

 コントロールコードは常にエスケープされます。(リファレンスのコードにはバグがある)
 コマンドの順序を最適化することにより、圧縮率がリファレンス比で数%程度向上しています。
 テーブル内容の更新に関するコマンドは一切使用しません。組み込み用途向けの簡易デコーダでも利用可能なデータを出力します。

BOCU-1エンコーダ

 ファイル先頭以外にBOMが出現した場合、BOMに推奨されるエンコードは行なわれず、サイズが最も小さくなるデータが出力されます。

その他

 このプログラムは、入力ファイルを全てメモリ上で変換してから出力ファイルに書き出します。
 そのため、入力ファイル名と出力ファイル名に同一の名前を指定した場合でも、元ファイルの置き換え動作として問題なく実行することができます。
 ただし、搭載メモリ量よりも大きい、あまりにも巨大すぎる(10Gバイト越えとか)テキストファイルの場合は変換に失敗する場合があります。ご注意な。

お約束

 このプログラムは極力正しく動くよう望んで作られたものですが、無保証です。動作に問題がある場合はご報告いただけると助かります。

履歴

2015.09.23 v0.01
 現実逃避でスモーキーな一発ネタで終わるはずが、なぜか完成してしまったので俺得ツールとして公開。俺得最高!

2015.09.24 v0.01a
 出力ファイル名を省略した際に、自動生成された出力ファイル名を画面に表示するよう改良。

co (Twitter)

inserted by FC2 system