タグ:変換
ZIPファイル解凍時の「文字化け」と対処法 (Linuxにて)

PCでいろんな作業をしていると、「文字化け」という現象に出くわす時がたまにある。これは、日本語の入力システムの多様さに由来している。

 

まだ、いまのように、Windowsがなかった時代、MS-DOSというオペレーティングシステムが全盛だったころ、日本語の文字入力は、マイクロソフトのDOSでは、shift-JIS、NECのPC9801系列ではJIS、UnixではEUCというまったく別な文字コードが使われていた。

 

また、デリミタ(Delimiter)とよばれた区切りコードも、キャリッジリターン[CR] 、ラインフィード[LF]、あるいは、キャリッジリターン+ラインフィード[CR+LF]というように、何種類かあった。実は、これらの間を互いに変換してくれるフリーソフトウェアも存在した。私もよく利用させていただいた記憶がある。

 

Windowsが全盛となった現在、これらのことはほとんど意識しなくても済むようになった。なぜならば、システムが自動的に変換してくれて、これらの違いを吸収してくれるからである。

 

私のように、Linuxを使っていても、このあたりは、あまり意識していない。ただ、「文字化け」は時々起こる。特に、Windowsで作成したファイルがWindowsで圧縮された場合、このZIPファイルをLinuxで解凍しようとすると、文字化けとなる。この問題は、長い間、悩みの種であった。(私の場合は、Dual BootのPCを使っているので、いったんWindowsを起動し、解凍した後に、Linuxを起動して読み込む、といった操作をしていた。)

 

だが、昨年、ひとつのスクリプトを見つけた。このスクリプトは、たったひとつの点をのぞいてすばらしいものであった。一年ほど使ってみて、使い慣れたものなので、ここに紹介させていただこうとおもう。(*)

 

========== (ここから) ==========

#!/usr/bin/perl

use Archive::Zip;

use Encode;

 

my $zip = Archive::Zip->new($ARGV[0]) or die;

for ($zip->members) {

$zip->extractMember($_, encode('UTF-8', decode('CP932', $_->fileName)));

}

========== (ここまで) ==========

 

この部分を例えば、「xunzip.pl」などのファイル名で保存し、

 

chmod 755 xunzip.pl

 

などで、
実行可能にしておく。そして、

 

./xunzip.pl sample.zip

 

のように使用する。

 

これは、Perl(パール)スクリプトとよばれるもので、perl-Archive-Zipというパッケージが必要となる。あらかじめ、インストールしておく。

 

私には、理解不足の点もあるが、Windowsで使用されているCP932という文字コードを、Linuxで使用されているUTF-8に変換するものである。とても便利なスクリプトなのである。

 

ただ、ひとつ、欠点は、パスワードがZIPファイルにかけられていると、使えないということ。なにか、やりかたはあるのだろうが、いまのところ、不明のままにしておいてある。

 

(2011-8-15)

 

 

(*) Nikkei Linux雑誌2010年9月号のp.50にサンプルとして掲載されていたものを引用させていただきました。

 

 

使っていますか? 2GBまで無料の「Dropbox」

 

 

あなたのお持ちの独自ドメイン、全て利用できます!

  • 音楽
40年前の吹奏楽演奏会

街の電気量販店で、「TAPE EXPRESS」というものを見つけた。どうやら、カセットテープの音源をmp3形式に変換するハードウェアだということが理解できた。

 

自宅には、昔のカセットテープがいくつかある。特に、高校時代に録音した吹奏楽の演奏会のカセットテープがあったので、いつかは、これを聴きたいとおもっていた。そのハードウェアの値段が手頃であり、いままで貯めていた「ポイント」も使えたので、思い切って購入してしまった。

 

そして、昔の(40年前の)カセットテープをデジタル音源に変換しようと試みたのであった。

 

TAPE EXPRESSというカセットテープからmp3形式のファイルに変換する装置

 

まず、別の音楽テープで、練習を兼ねて、変換を試みた。説明書の手順どおりに行えば、特に問題ないようである。

 

12曲入りのカセットテープから、mp3形式のファイルを12個取り出すことができた。

 

で、次に本番のテープである。同様にやってみようとしたが、問題が発生した。このテープは、過去に不具合があって、何回か補修した記憶がある。何か所か補修してある部分があった。

 

当時のコンパクトカセットテープ、テープが切れやすかった

 

実際、変換をはじめてみたが、その補修部分でテープが切れたり、ホイールにからみあったりして、なかなかうまくいかない。何十年も経過しているのだから、しかたないのだが、カセットテープのねじをはずして、切れたテープを糊でつないだりして、ようやく、何回かに分けて、mp3ファイルに変換することができた。

 

いざ、できあがったものを聴いてみると、とてもなつかしいものであった。

 

高校3年の文化祭のときに、吹奏楽部の演奏会があり、友人からカセットテープレコーダを借りて、録音したことを覚えている。

 

当時は、まだカセットテープレコーダは、世の中に商品として出現したばかりの頃であったとおもう。録音の主流は、まだ、4インチ/6インチのリールテープであった。

 

曲目は、当時の流行していた曲も含めて、次のとおりであり、ところどころに各楽器パートの紹介が入っている。録音状態はあまり良くない。当時のカセットレコーダのマイク集音のため、多少、雑音があり、また、テープの破損などがあり、修繕を繰り替えしたため、途中、欠落箇所がいくつかある。

 

1 希望

2 空よ

3 マンポNo.5

4 西部の人々

5 闘牛士のマンポ

6 手紙

7 コンテンポラ

 

ここに、ファイルを掲載したので、興味をお持ちの方はぜひ一度聴いてみていただきたい。そのころ、高校生て゜あった自分自身に重ね合わせて、いろいろな想い出とともに懐かしさがこみ上げてくる。そういえば、こんな時もあったなと。

 

 

■昭和45年度恒高祭吹奏楽演奏会
(1970年11月14日、新潟県立有恒高等学校吹奏楽部)

 

https://fp46.net/alumni/y1970/

 

(2011-2-20)

 

 

  • 体験
C言語の習い始めと「最小自乗法」

これも、いまでは表計算ソフトのExcelやCalcなどで簡単にできるとおもうのだが、およそ25年ほど前はまだそれほど便利ではなかった。ちょっとした実験データを整理するのに使った「最小自乗法」のコードは、自分でコードを書いて使っていた。

 

その当時は、パソコンも8ビットから16ビットへの移行の時期で、プログラミング言語はもちろんBASICがメインであった。

 

当時、作成したコードの一部をご紹介しよう。

 

測定するデータとして、x と y の組を何個か(n組としよう)を準備し、いわゆる y=ax+b の係数 a と b を求めるものであり、直線への回帰の度合いを r^2 という指標で表すものである。

 

これをBASIC言語で記述すると、次のような感じになる。

 

=====(ここから)=====

1 ' file"LSQL"

10 ' least square method (linear)

20 'SCREEN 0:CLS:CLEAR:KEY OFF

30 DIM X(30),Y(30),Z(30),W(30),V(30)

40 PRINT"formula Y = A X + B":PRINT

45 PRINT

50 INPUT"quantity of set ( N ) =";N

60 PRINT:PRINT

70 FOR I=1 TO N

75 PRINT I;

80 INPUT" ( X , Y ) =";X(I),Y(I)

85 IF X(I)=-1 THEN I=I-1:GOTO 75

90 NEXT I

100 FOR I=1 TO N

110 Z(I)=X(I)*Y(I):W(I)=(X(I))^2:V(I)=(Y(I))^2

120 NEXT I

130 Z1=0:X1=0:Y1=0:W1=0:V1=0

140 FOR I=1 TO N

150 Z1=Z1+Z(I):X1=X1+X(I):Y1=Y1+Y(I):W1=W1+W(I):V1=V1+V(I)

160 NEXT I

170 A=(Z1-(X1*Y1)/N)/(W1-(X1)^2/N)

180 B=Y1/N-A*(X1/N)

190 R1=(Z1-(X1*Y1)/N)^2

200 R2=W1-(X1)^2/N

210 R3=V1-(Y1)^2/N

220 R=R1/(R2*R3)

225 PRINT:PRINT

230 PRINT" A =";A

240 PRINT

250 PRINT" B =";B

260 PRINT

270 PRINT" R^2 =";R

280 PRINT

290 END

=====(ここまで)=====

 

BASICはインタプリターとよばれるものであって、一行ずつ解釈しながら実行する。そのため、スピードは遅い。これに対して、コンパイラとよばれるものは、一度機械語に変換してから実行するので速い。

 

C言語のコンパイラが16ビットパソコンで使えるときき、なんとかしてBASICで書いたコードをCに変換できないかを考えたものであった。

 

C言語のコンパイラは、当時、LSI-C86試食版ver3.30 というものが、たしか、雑誌の付録で無償提供されていたのであった。

 

そんなとき、街中の本屋さんで偶然みつけたのが、科学技術関係のフリーソフトを納めたCD-ROMであり、その中におもしろいものがいくつかあった。

 

そのひとつが、「B to C」という変換ソフトで、BASIC言語のコードをC言語に強制的に変換するものであった。変換後の多少の手直しは必要だが、そのときは、とても便利であった。たとえば、上述の「最小自乗法」のコードは、次のようになる。

 

=====(ここから)=====

/**** Least Square Method by Osamu Furukawa ****/

#include"stdio.h"

#include"math.h"

#include"string.h"

#include"stdlib.h"

unsigned char _s0[256],_s1[256],_s2[256];

float a;

float b;

int i;

int n;

float r;

float r1;

float r2;

float r3;

float v[31];

float v1;

float w[31];

float w1;

float x[31];

float x1;

float y[31];

float y1;

float z[31];

float z1;

main()

{
extern float a;

extern float b;

extern int i;

extern int n;

extern float r;

extern float r1;

extern float r2;

extern float r3;

extern float v[31];

extern float v1;

extern float w[31];

extern float w1;

extern float x[31];

extern float x1;

extern float y[31];

extern float y1;

extern float z[31];

extern float z1;

putchar('\n');

printf("Least Square Method \n");

putchar('\n');

printf(" formula Y = A X + B\n");

putchar('\n');

printf(" quantity of set ( N ) ="" ?");

scanf(" %d",&n);

putchar('\n');

for(i=1;i<=n;i+=1){

l_75: ;

printf(" %d",i);

printf(" ( X , Y ) ="" ?");

scanf(" %f, %f",&x[i],&y[i]);

if(x[i]==-1){

i=i-1;

goto l_75;}

}

for(i=1;i<=n;i+=1){

z[i]=x[i]*y[i];

w[i]=pow((x[i]),2);

v[i]=pow((y[i]),2);

}

z1=0;

x1=0;

y1=0;

w1=0;

v1=0;

for(i=1;i<=n;i+=1){

z1=z1+z[i];

x1=x1+x[i];

y1=y1+y[i];

w1=w1+w[i];

v1=v1+v[i];

}

a=(z1-(x1*y1)/n)/(w1-pow((x1),2)/n);

b=y1/n-a*(x1/n);

r1=pow((z1-(x1*y1)/n),2);

r2=w1-pow((x1),2)/n;

r3=v1-pow((y1),2)/n;

r=r1/(r2*r3);

putchar('\n');

printf(" A = %g\n",a);

putchar('\n');

printf(" B = %g\n",b);

putchar('\n');

printf(" R^2 = %g\n",r);

putchar('\n');

}
=====(ここまで)=====

 

と、こんな感じになるのであった。もちろん、むだの部分も多いとおもうが、計算処理は速くできたのであった。

 

このようなきっかけが、私のC言語の習い始めであった。ただ、その後、表計算ソフトが発達し、DOSベースでのLotus1-2-3や、Windows3.1 ベースでExcelなどが簡単に使えるようになってからは、この「C言語」との関係はだんだん薄くなってしまった。

 

だが、これも私にとっては貴重な良い経験であった。

 

(おそらく、読者の皆さんのなかには、この記事をごらんになって、自分だったらもっとスマートにコーディングできるのにと思われる方もおられるとおもう。なにしろ、あくまでも、当時の私の経験したことなので、ご寛容を願いたい。)

 

(2010-9-12)

 

 

(追記)

 

もっとスマートにコーディングするとしたら、こんな感じになるでしょうか。

 

(2010-9-12)