|
2002/01/31
プログラム〜(泣
日本語嫌いになってしまいそうなくらい処理が面倒です。
シュルツ(以下シ):ビバ!挫折!
分かってて言ってるのか?
さてシューちゃんはほっといて、先に進めましょう。
日本語(ここではShift-JIS)を扱う上で重要なことは、1バイトではないということです。
どういうことかというと・・・
「Intel入ってる?」<何でこの文字列よ?
このとき”Intel”は1バイト、それ以外は2バイトなんですよ。
この文字の長さは・・・12バイト
そして文字列の使用容量は・・・19バイト
では文字列を一文字ずつ表示したいとき、
// 文字が終わるまで繰り返し
for( i=0 ; i<length ; i++ ){
// 表示
Show << Character;
// 表示する位置をひとつ進める
Character++;
}
みたいになるのは分かると思います。
シ:ハイ!先生!
何ですか?シュルツ君。
シ:1バイト、2バイト文字が入ってもちゃんと動きますか?
それはこれから言うので少しは黙っていてください。
シ:(今まで黙っていたような・・・)
幸いShift-JISでは1バイト目が81[16進数]以上に設定してあります。
(ASCII文字は7F[16進数]まで)
つまり次のようにしたらよさそうじゃないかと思いつきます。
for( i=0 ; i<length ; i++ ){
// Characterが80[16進]よりも大きいときはひとつ進める。
if( Character > 0x80 ) Character++;
Show << Character;
Character++;
}
少しC言語をかじった人ならば分かるでしょう。
なぜ動かないかが(笑)
冗長になってきたので、スピードアップ。
シ:ここって「更新履歴」なページでは?(笑)
いいのいいの。俺的な書き込みができる唯一の場所ですから。
std::cout << chLine << std::endl;
for( int i=0 ; chLine[i]!='\0' ; i++ ){
if(chLine[i]<0){
chShow[0] = chLine[i];
chShow[1] = chLine[i+1];
chShow[2] = '\0';
i++;
}else{
chShow[0] = chLine[i];
chShow[1] = ' ';
chShow[2] = '\0';
}
std::cout << chShow << std::endl;
}
さっき作ってみた(笑)
2バイトだったらそのまま表示。1バイトだとその後にスペースを追加。
ちなみに63バイト×1,000,000で1秒かかりませんでした。
というより、0.627秒(10回平均)もかかりました(泣)
1秒として計算すると、1億文字/sec。100kバイト/sec。
シ:ソレはすごいんですか?
・・・あんましわかんね(爆)
シ:この文章って?
燃やせないごみ(笑)
シ:長く語った割には実りが無いですね。
というわけで、今度はワインでイキマス。
シ:かなり、脈絡ないですよ。
|