NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

ASCⅡ→JISコード変換

文字コードの変換について質問があります。
テスト装置等でプリンターポートから出てくるデータをシリアル変換ケーブルを経由し取り込もうと思っております。基本的にはASCⅡに準拠した形で取り込めそうなのですが、当然ながら漢字を取り込むことができません(コード変換されず、変換前の文字がそのまま取り込まれてるイメージで
す)。JISコードが使われているためと思うのですが、LabVIEW上でASCⅡ→JISコードに変換するような例題等あるでしょうか。送り手側の具体的コード内容(規格等)等、未確認部分が多く情報不足ではありますが、関連する情報などありましたら参考にさせて頂きたく思います。現在検討しているPRGでは漢字で表現されている部分を除いて処理しても実使用上問題なさそうですが、よい情報があれば、今後の参考にさせて頂きたく思います。よろしくお願いします。
0 件の賞賛
メッセージ1/7
8,655件の閲覧回数
いつもお世話になっております。
日本ナショナルインスツルメンツ技術部のタンと申します。
 
Express VIの計測I/O器アシスタントで読み取るときは如何でしょうか。計測I/O器アシスタントは自動解析を行ってくれますので、LabVIEWが認識する文字列タイプでありましたらASCIIに変換されます。計測器I/Oアシスタントのシリアル通信例としてVIを添付いたします。
 
もし、16進数のコードで読まれている場合は下記の日本語のデータベースを参照していただければと思います。例えば、次のデータベースのサンプルのような16進数で表示されている場合です。
 

どのようにして16進表示の文字列を標準表示の文字列で同様に表示させるか?

このデータベースでは関連のリンク等もあり、文字列変換方法のサンプルがありますのでご参照ください。
 
上記の方法等で解決されない場合は、作成されたVIと読まれたデータのスクリンショットを送っていただければと思います。
 
宜しくお願いいたします。
 
Thant Sin Naing
Application Engineer
日本ナショナルインスツルメンツ技術部
メッセージ2/7
8,598件の閲覧回数

たびたび恐縮です。

HP4145A様がおっしゃっているのは、テスト装置から送られてくる文字列に含まれる漢字が、昔ながらのJISコードであり、そのままLabVIEWに取り込むと、LabVIEWはWindows上のアプリのためShiftJISである必要があるので化けて見えてしまうため、テスト装置から送られてくるJISコード漢字を、LabVIEW(Windows)でも見えるShiftJISコード漢字に変換したい、という意味かと思ったのですが、そういう意味で良いでしょうか?

インターネット上でいろいろ検索すると変換の基本方法が得られたりしますのでそれをもとに書いてみると、1バイトASCII文字&漢字IN/OUTのESCコード&JISコード2バイト漢字が混在する文字列に対して、JISコード漢字部分をShiftJISコード漢字に変換してLabVIEW(Windows)でも読めるようにするviは、添付のようになるかと思います。

テスト装置から送られてくる漢字コードの前後に付与される漢字IN/OUTのESCコードがこれと同じ形式かどうか良く分からないので、ちゃんと変換できるか不明ですが、JISコードの一般的な漢字IN/OUTのESCコードが入っていれば概ね大丈夫かと。

(例によって、上記のような意味でなかったら、すみません・・・)

 

メッセージ3/7
8,596件の閲覧回数
タン様 白石様
 
アドバイス頂き、ありがとうございます。
 
意図としては、まさしく白石様のおっしゃる通りです。ややこしい質問だったにも関わらず、変換用サンプルviまで付けて頂き、大変恐縮です(今回の案件については具体的なサンプルを付けて頂くのは難しいと思っておりましたので、感嘆しております)。私にとっては非常に貴重なサンプルであり、できれば変換ルールを並べながら、viの処理方法を理解したいと思っております。お手数でなければ、白石様が参考にされた変換ルールに関する資料又はwebページを教えて頂けるとありがたいです。
→viの中の個々の動作は判るのですが、なぜそれでコード変換できてるのかまで理解できていないため、できれば中身も理解しておきたく考えております。
0 件の賞賛
メッセージ4/7
8,566件の閲覧回数

意図が思ったようなことで、良かったです。

漢字コード変換ですが、一般に漢字コード変換というと、2つのポイントがあります。①漢字を表す2バイトコードを、コード体系間で変換(演算)。②漢字と1バイト文字が混在している文字列で1つ1つ漢字かどうかを判別しながら処理(解釈)。先日のviは、この2つをそれぞれのviに分離して書いた形になります。

(さらに高度だと、③何のコード体系か分からない文字列を使われているコードからコード体系を判別、というものもあります)

****

①については、幸い、漢字の並びはコード体系間で基本的に同じなので、コード体系ごとに使う1バイト目・2バイト目の範囲内でどんな規則でどう並び直しているか、だけになります。例えばJISコードなら1バイト目は21H~74H、2バイト目は21H~7EHで、この範囲に漢字が並べられています。ShiftJISなら、1バイト目は81H~9FHとE0H~FCH、2バイト目は40H~FCHの範囲に並べられています。従って、1バイト目と2バイト目を適当に演算すれば、コード間の変換は容易です(もともと変換は規則的)。Webでは「JIS SJIS 変換」という3つのキーワードで結構たくさんヒットします。見た目の変換方法は少しずつ違いますが、やっている中身と結果は同じです。コード体系の範囲外チェックはありません。

http://homepage2.nifty.com/DSS/WinSys/JISSJIS.htm

http://www.beta.or.jp/~oouchi/code/

http://i16.jp/soft/convsjis.htm

などがありました。(最後のものは相当短くて美しいですが創意工夫があり著作権放棄していないと明記しているので今回のviでは採用しなかった)

②は、文字列中の漢字と1バイト文字の境目がどうなっているかを知る必要があります。上記3サイトはコード変換のみで、これには触れていません。JISコードでは、漢字で使うコード範囲が普通の1バイト文字と重複しているため、別途「ここから漢字」「ここから1バイト文字」を表す符丁が必要です。これがESC(1BH)で始まるエスケープシーケンスで、規格により何通りかあるので、先日のviではどれが出現しても良いようにしています。ShiftJISでは、漢字の1バイト目は、普通の1バイト文字(ANK文字)とは重複せず、これが出ればその文字と次のバイトとで漢字1文字と分かるので、エスケープシーケンスはありません。ということで、JIS→ShiftJISは、エスケープシーケンスの出現に注意しながら「今漢字モード?」のフラグを使い、漢字モードなら①のコード変換を使って2バイトずつ演算で変換し、1バイト文字モードならそのまま残し、エスケープシーケンスなら内容によってフラグを切り替える、ということを繰り返しながら文字を次々と処理していきます。

なお、先日のviでは、エスケープシーケンスが漢字IN/OUT以外だったとき、エスケープシーケンスが無くなってしまうので、漢字IN/OUT以外のエスケープシーケンスはそのまま残すのが正しかったと後で思いました。。

エスケープシーケンスもいくつかのサイトにありますが、これと、コード体系ごとに漢字が使うコード範囲を記してある分かりやすいものは、

http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html

などがあります。

****

ただし、いずれも漢字コードに関するオフィシャルなものでなく個人サイトに近いので、あくまで御参考ということで(本来は、ちゃんと規格で定められているから、その「おおもと」を見るのが正しいし、複数の方法で結果が一致することを予め確認したほうが良いです)。

以上、御参考になれば・・・

 

メッセージ5/7
8,548件の閲覧回数
白石 様
 
いつも適切な回答をいただき誠にありがとうございます。
 
この度は、サンプルVIおよび詳細を丁寧にしていただき大変感謝しております。白石様のように幅広い知識をもっていらっしゃる方がLabVIEWをご愛用いただいていることは光栄だと思っております。
 
今後とも宜しくお願い申し上げます。
 
Thant Sin Naing
日本ナショナルインスツルメンツ
0 件の賞賛
メッセージ6/7
8,526件の閲覧回数

白石様

丁寧に解説までして頂き、ありがとうございます。特に、最後に添付頂いたサイトは判り易いように感じられます。盆休みのため、暫く頂いたサンプルviを見ることができませんが、頂いたサイトの資料にて変換ルールの概要を把握した上で、viの処理内容を追いかけていこうと考えております。データの処理は、色々と面倒で不慣れなことも多いのですが、Labviewを使っていく上では、その過程で得られたことが後々役立つことも多く、アドバイス頂いた内容も非常に役立っております。

0 件の賞賛
メッセージ7/7
8,521件の閲覧回数