いつもお世話になっております。
汎用機から取得された固定長のテキストデータがあります。
固定長というのは、汎用機上で、全角半角の区切りにシフトイン・シフトアウトのコード込みで固定長であって、ダウンロードした状態ではシフトコードが抜けた状態て固定長にはなっていませんが、全角文字の最初と最後に1バイトの文字を加えると、確かに固定長になっています。
カンマ区切りであればもっと楽なのにと思うのですが、社外から来るデータなのでなかなか対応が難しいところです。
Javascriptを使ってこれを配列に収めて、データベースに書き込みたいのですが、Javascriptのsubstr関数は文字数区切りであるため、substrのバイト数カウント対応のイメージでfunctionを作るところから始めています。できあがりのイメージはこんな感じです。
str = "123あいうAB"; // 123<あいう>AB
alert(substrB(str,3,8)); // あいう
str = "456あa AB"; // 456<あ>a AB
alert(substrB(str,3,8)); // あ
汚いソースですが、シフトイン・アウトが複数あった場合や、その途中で切れた場合にもうまく動きません。
例えば、ダミーでシフトコードを入れてから分割して後で消すとかしたほうが簡単なのでしょうか?
もっとシンプルなやり方で切り出す方法がありましたら、ご指導頂ければ有難いです。
javascript
1function substrB(instr, pos, len){ 2 var sht = 0; 3 var inlen = 0; // 元の長さ 4 var outlen = 0; // 出力結果の長さ 5 var outstr = ""; // 出力結果 6 pos = Number(pos); 7 len = Number(len); 8 for(var i=0;i<instr.length;i++){ 9 var chr = instr.charAt(i); 10 if(chr.match(/^[^\x01-\x7E\xA1-\xDF]+$/) != null){ 11 // 全角 12 cnt = 2; 13 if(sht==0){ 14 cnt += 1; 15 } 16 sht = 1; 17 } else { 18 // 半角 19 cnt = 1; 20 if(sht==1){ 21 cnt += 1; 22 } 23 sht = 0; 24 } 25 inlen += cnt; 26 if(pos<inlen){ 27 outlen += cnt; 28 if(outlen > len){ // 長さを越えた時はブレイク 29 break; 30 } 31 // 全角で終わった場合は最後の文字は入れない 32 if(outlen == len){ 33 if(cnt >= 2 && sht == 1){ 34 break; 35 } 36 } 37 outstr += chr; 38 } 39 } 40 if(sht==1){ 41 inlen += 1; 42 } 43 return outstr; 44} 45
あなたの回答
tips
プレビュー