過去の桐井戸端BBS (桐ver.9)
27342 データの中にJISコード文字以外が使われていないかを調べたい 尾形 2004/08/12-07:34
よろしくお願いします。桐9です
定期的にエクセル(CSV)でデータをもらいます
人名を含んでいますので、中には旧漢字の方もいます

最近のパソコンは便利になってきたので旧漢字もある程度使えるようです。
UNICODE文字を含んでいた場合
桐では使えないので変更する必要があります
桐で扱えない文字が含んでいないかを判定する方法を教えてください

よろしくお願いします

27343 Re:JISコード文字以外が使われていないかを調べる方法 ONnoji 2004/08/12-09:59
記事番号27342へのコメント
尾形さん、こんにちは。

桐からテキストファイルを出力するとき、
「JIS以外の文字を使用しないでください」という要望があり、
私は以下の手続きを自作して使っています。

しょぼいプログラムですが、ご参考になれば幸いです。

一応、NEC特殊文字とIBM拡張文字をチェックしているつもりです。

※IBM拡張文字はシフトJISのFA40h以降
※NEC特殊文字は JIS 2D21 〜 2D7E

UNICODEは桐で入力できないので考慮していませんが…

BUGがあったらすいません。

*----------------------------------------------------------------*
手続き定義開始 prcScopeJis( 文字列 &string, 参照 文字列 &errorchr )
 変数宣言 自動,整数 { &pos = 1, &len, &step = 1 }
 変数宣言 自動,文字列{ &chr, &jis, &jisNecMini = "2D21",
&jisNecMax = "2D7E" }
 変数宣言 自動,文字列{ &shiftjis, &ibm = "FA40" }

 &errorchr = #u
 &string = #trim( &string, 4 )
 &len = #文字数( &string )

 繰り返し &pos = 1, &len, &step

  &chr = #sstr( &string, &pos, 1 )
  &jis = #HEX32( #JIS( &chr ) )
  &shiftjis = #HEX32( #シフトJIS( &chr ) )

  if ( &jis >= &jisNecMini .and &jis <= &jisNecMax )
   &errorchr = &errorchr + "(" + &jis + ":" + &chr + ")"
  end

  if ( &shiftjis >= &ibm )
   &errorchr = &errorchr + "(" + &shiftjis + ":" + &chr + ")"
  end

 繰り返し終了

手続き定義終了
*----------------------------------------------------------------*



27346 Re:JISコード文字以外が使われていないかを調べる方法 うにん 2004/08/12-12:58
記事番号27343へのコメント

>>最近のパソコンは便利になってきたので旧漢字もある程度
>>使えるようです。UNICODE文字を含んでいた場合
>>桐では使えないので変更する必要があります

なので、むしろ

>一応、NEC特殊文字とIBM拡張文字をチェックしているつもりです。

UNICODEの文字の代りに使えるのがあればそれらを使うようにしたいってことじゃないですか?
桐に取りこむ前に処理しないとどうしようもないので、桐ではできないでしょう。

27351 Re:JISコード文字以外が使われていないかを調べる方法 尾形 2004/08/12-16:48
記事番号27346へのコメント
どうも、ありがとうございます

桐の表に取り込みした後で、チェックをして
使えない文字が含まれている行を絞込して
手動で変更させたいと思っています

ONnojiさんのを参考にしてみます
#項目計算式にできればウレシイのですけど

27366 Re:JISコード文字以外が使われていないかを調べる方法 磯田 2004/08/13-03:59
記事番号27351へのコメント
>#項目計算式にできればウレシイのですけど

私は次のような項目計算式で[氏名]欄の文字種を判定しています。
文字コードの範囲を判定することで文字種を判定しています。

0・・・JIS
I・・・IBM拡張漢字
N・・・NEC拡張漢字
E・・・外字領域
G・・・外字領域
?・・・その他、不明
ちなみに文字数は7文字まで対応しています。これを参考にしてみてください。


#条件選択(#HEX(#SJ(#部分列([氏名],1,1)))<"ED40","0",#HEX(#SJ(#部分列
([氏名],1,1)))≦"EEF1","N",#HEX(#SJ(#部分列([氏名],1,1)))
≦"F7DA","E",#HEX(#SJ(#部分列([氏名],1,1)))≦"F9FC",G,#HEX(#SJ(#部分
列([氏名],1,1)))≦"FC$B","I",1,"?")+#条件選択(#HEX(#SJ(#部分列([氏
名],2,1)))<"ED40","0",#HEX(#SJ(#部分列([氏名],2,1)))≦"EEF1","N",#HEX
(#SJ(#部分列([氏名],2,1)))≦"F7DA","E",#HEX(#SJ(#部分列([氏名],2,1)))
≦"F9FC",G,#HEX(#SJ(#部分列([氏名],2,1)))≦"FC$B","I",1,"?")+#条件選
択(#HEX(#SJ(#部分列([氏名],3,1)))<"ED40","0",#HEX(#SJ(#部分列([氏
名],3,1)))≦"EEF1","N",#HEX(#SJ(#部分列([氏名],3,1)))
≦"F7DA","E",#HEX(#SJ(#部分列([氏名],3,1)))≦"F9FC",G,#HEX(#SJ(#部分
列([氏名],3,1)))≦"FC$B","I",1,"?")+#条件選択(#HEX(#SJ(#部分列([氏
名],4,1)))<"ED40","0",#HEX(#SJ(#部分列([氏名],4,1)))≦"EEF1","N",#HEX
(#SJ(#部分列([氏名],4,1)))≦"F7DA","E",#HEX(#SJ(#部分列([氏名],4,1)))
≦"F9FC",G,#HEX(#SJ(#部分列([氏名],4,1)))≦"FC$B","I",1,"?")+#条件選
択(#HEX(#SJ(#部分列([氏名],5,1)))<"ED40","0",#HEX(#SJ(#部分列([氏
名],5,1)))≦"EEF1","N",#HEX(#SJ(#部分列([氏名],5,1)))
≦"F7DA","E",#HEX(#SJ(#部分列([氏名],5,1)))≦"F9FC",G,#HEX(#SJ(#部分
列([氏名],5,1)))≦"FC$B","I",1,"?")+#条件選択(#HEX(#SJ(#部分列([氏
名],6,1)))="","",#HEX(#SJ(#部分列([氏名],6,1)))<"ED40","0",#HEX(#SJ(#
部分列([氏名],6,1)))≦"EEF1","N",#HEX(#SJ(#部分列([氏名],6,1)))
≦"F7DA","E",#HEX(#SJ(#部分列([氏名],6,1)))≦"F9FC",G,#HEX(#SJ(#部分
列([氏名],6,1)))≦"FC$B","I",1,"?")+#条件選択(#HEX(#SJ(#部分列([氏
名],7,1)))="","",#HEX(#SJ(#部分列([氏名],7,1)))<"ED40","0",#HEX(#SJ(#
部分列([氏名],7,1)))≦"EEF1","N",#HEX(#SJ(#部分列([氏名],7,1)))
≦"F7DA","E",#HEX(#SJ(#部分列([氏名],7,1)))≦"F9FC",G,#HEX(#SJ(#部分
列([氏名],7,1)))≦"FC$B","I",1,"?")

27505 Re:JISコード文字以外が使われていないかを調べる方法 hidetake 2004/08/26-16:29
記事番号27342へのコメント
>よろしくお願いします。桐9です
>定期的にエクセル(CSV)でデータをもらいます
>人名を含んでいますので、中には旧漢字の方もいます
>
>最近のパソコンは便利になってきたので旧漢字もある程度
>使えるようです。UNICODE文字を含んでいた場合
>桐では使えないので変更する必要があります
>桐で扱えない文字が含んでいないかを判定する方法
>を教えてください

???

今更だけれど、これって前提がおかしいのでは無いですか?

普通のテキストファイルの場合(CSVも含む)、1つのファイル内に複数の文字コードは混在できないわけで、
Excel でCSV に落とした段階で、含まれる文字はすべて Shift_JIS でしょう!

この段階で、もし Excel ブック内に Unicode オンリーな文字を含む場合は、その文字は ? に変換されて落とされるはずです。
その時点でアウトなハズです!

Excel 内に Unicode オンリーな文字を含む場合で、
その文字をそのまま文字として出力するためのテキストファイル形式は
「Unicode テキスト(*.txt)」を指定し落とす必要があるはずです。
そして、この場合は「桐」ではこのファイルの文字を全部読む事ができなくなってしまいます。

Unicode な文字と、拡張漢字(IBMやNEC)とごっちゃにされているのでは無いでしょうか?
桐自体の話だけであれば、桐はフォントファイルがフォントさえ持ち合わせていれば
Shift_JIS (JIS2000な話はおいて
おく)なコードであれば読めるるし出力できるはずです。

と言う事で、Unicode の文字を処理するには Excel 内で処理するかでしょう・・・
27506 Re:JISコード文字以外が使われていないかを調べる方法 hidetake 2004/08/26-16:43
記事番号27505へのコメント
>桐自体の話だけであれば、桐はフォントファイルがフォント
>さえ持ち合わせていれば Shift_JIS (JIS2000な話はおいて
>おく)なコードであれば読めるるし出力できるはずです。

私は桐のデータとオフコンとの関係では、桐からオフコンにデータを落とす際に
オフコンで扱えない文字はあえて「〓」変換し渡すように sed と次のようなスクリプトを使って
変換した上で、オフコンにデータは落としています。

CHECK.SED (sed -f check.sed hogehoge.txt > hoge.txt)
======================================================
# JIS規格以外の文字を「〓」に変換
#
-----------------------------------------------------------------------------
# 222F - 232F (81AD - 824E) ※〓の後〜数字の前の空き間(新JIS記号も)
# 233A - 2340 (8259 - 825F) ※全角数字の後〜英大文字の前の空き間
# 235B - 2360 (827A - 8280) ※全角英大文字の後〜英小文字の前の空き間
# 237B - 237E (829B - 829E) ※全角英小文字の後〜ひらがなの前の空き間
# 2474 - 247E (82F2 - 833F) ※ひらがなの後〜全角カタカナの前の空き間
# 2577 - 257E (8397 - 839E) ※全角カタカナの後〜ギリシア文字の前の空き間
# 2639 - 2640 (83B7 - 83BE) ※ギリシア大文字の後〜小文字の前の空き間
# 2659 - 267E (83D7 - 843F) ※ギリシア文字の後〜ロシア文字の前の空き間
# 2742 - 2750 (8461 - 846F) ※ロシア大文字の後〜小文字の前の空き間
# 2772 - 2F7E (8492 - 889E) ※漢字第1水準の前の空き間(新JIS罫線も)
# 4F54 - 4F7E (9873 - 989E) ※第1水準と第2水準の間の空き間
# 7421 - 7424 (EA9F - EAA2) ※新JISで字形変更された尭槙遥瑶の旧字体
# 7425 - 7E7E (EAA3 - EFFC) ※第2水準の後の空き間
# 7F21 - FCFC (7F21 - FCFC) ※第2水準の後の空き間
#
-----------------------------------------------------------------------------
/[ -・]/{
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[・-・]/〓/g
s/[堯-・]/〓/g
}
======================================================

27509 Re:JISコード文字以外が使われていないかを調べる方法 尾形 2004/08/27-08:05
記事番号27505へのコメント
どうも、ありがとうございます

>この段階で、もし Excel ブック内に Unicode
>オンリーな文字を含む場合は、その文字は ? に変換されて
>落とされるはずです。その時点でアウトなハズです!
そうです
?ででています
ただそれに気がつかないものですから
今後、エクセル(外部)とのやりとりをする場合
毎回気をつけておかないとまずいなぁと思った次第です
手作業で、エクセル→csv→桐表といった作業した場合
つい忘れそうです

27510 Re:JISコード文字以外が使われていないかを調べる方法 hidetake 2004/08/27-08:54
記事番号27509へのコメント
>今後、エクセル(外部)とのやりとりをする場合
>毎回気をつけておかないとまずいなぁと思った次第です
>手作業で、エクセル→csv→桐表といった作業した場合
>つい忘れそうです

もし Excel 側で何らかのチェックや印付けができない場合、
Excel からの書き出しは「Unicode テキスト(*.txt)」で
必ず行うようなルール付けを行い、受け入れ側で Unicode
--> Shift_JIS の変換を行うような手順とし、その変換の
時に Unicode でしか表現できない文字は、何らかの印付けや
後でわかる変換を行うのも1つの方法だと思います。

例えば Perl を使えば Unicode.pm か Japanese.pm で
Unicode --> Shift_JIS の変換を行えば、Unicode でのみ
表現できる文字は &#xxxx; の形の数値参照形式で、その
文字は表現され変換されたと思います。
あとは、それを桐内でチェックしどのように表現し直すか!
と・・・

他にもやり方はあると思うけど、もし VSB で処理しよう
とすると、1文字ずつ変換しては変換結果が ? になる場合
は元の文字コードと何らかの印付けするようにする方法か
変換テーブルを持って照合する方法なのかな?
どの方法も遅そうだし、特に1文字ずつ処理する方法は
大変遅くなりそうだ!?

戻る