質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

0回答

1339閲覧

全角半角混じりの文字列をシフトコード込みのバイト数で切り出す

hatsuzo

総合スコア56

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/12/07 09:45

いつもお世話になっております。

汎用機から取得された固定長のテキストデータがあります。
固定長というのは、汎用機上で、全角半角の区切りにシフトイン・シフトアウトのコード込みで固定長であって、ダウンロードした状態ではシフトコードが抜けた状態て固定長にはなっていませんが、全角文字の最初と最後に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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/12/07 11:15

・汎用機から変換後の日本語のエンコーディングは何ですか? ・シフトイン・シフトアウトは何バイトですか? ・半角片仮名があって、それが1バイト文字側だったりしますか? ・変換前のデータを入手することは可能ですか?
AkitoshiManabe

2020/12/07 21:21

汎用機から取得したテキストについても、文字コードを確認して明記されたほうが良いですね。 --- 「JISコードの符号化表現(ISO-2022-JPによるエンコーディング)?」と感じましたが、示されるJavaScriptでは文字コード表における制御コードだけで単純に切り分けているため、シフトイン・シフトアウトと表記される内容が「JISコードのエスケープシーケンス」なのかどうか判別できず、なんとも言えない状態です(otnさんが指摘する内容も併せて確認し、質問文を見直してみてください)。
hatsuzo

2020/12/08 08:50 編集

otnさん、 AkitoshiManabeさん コメントありがとうございます。説明が足りませんでした。 >・汎用機から変換後の日本語のエンコーディングは何ですか? SJISです。 >・シフトイン・シフトアウトは何バイトですか? 各1byteです。 >・半角片仮名があって、それが1バイト文字側だったりしますか? 半角カナも入りえます。 >・変換前のデータを入手することは可能ですか? 変換前というのは、汎用機(正確に言いますとIBM system iかと思われます)のデータのことでしょうか?それは入手困難ですが、そこから吐き出された変換対象のデータについての補足です。 対象のデータをFTPでSJISコード扱い(quote type B)で弊社のIBM System i(AS400)に転送すると、シフトコードが自動的に挿入されて固定長レコードになります。 FTPで逆のことを行ってPC上にGETすると、元の状態に戻りました。同じ状態で作成されて完全にシフトコードが抜けているだけの状態だと思います。 AS400上で処理すれば普通にマッピングして変換処理できますが、WindowsServer側で変換処理を一元したいので、可能であれば、とこのような処理を考えている次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問