質問
CP932(Windows-31J)でエンコーディングされたCSVファイルに含まれる外字(拡張文字)(例:「髙」(はしご高)や「﨑」(立ち崎))を置換してShift_JIS形式で出力しようとすると、一部の文字で文字化けが発生します。原因と対処法を教えてください。
回答
「CSVファイルによる置換」ロジックの仕様制限が原因の可能性があります。「CSVファイルによる置換」ロジックでは、入力文字列に置換用CSVファイルの複数のレコードが一致した場合、先頭のレコードのみが置換処理に使用されます。そのため、複数の外字(拡張文字)が含まれる文字列では2文字目以降が変換対象にならず、文字化けが発生します。
例として「髙栁」の場合、置換用CSVファイル内で「栁」が1行目、「髙」が2行目に定義されているとき、先頭レコードである「栁」→「柳」の変換のみが実行され、「髙」は変換されないため出力結果が「?柳」となります。
この仕様制限を回避するには、「CSVファイルによる置換」ロジックの代わりに「文字ごとに置換」ロジックを使用します。「文字ごとに置換」ロジックでは、入力文字列中に外字(拡張文字)が複数含まれる場合も全てが置換対象となります。なお、「文字ごとに置換」ロジックを使用することで、Shift_JIS形式での出力においても問題なく意図通りに出力できることが確認されています。
「文字ごとに置換」ロジックを使用する際の処理概要は以下の通りです。
■スクリプト全体像

1. 置換用CSVファイル(変換テーブルファイル)を読み込む

2. 読み込んだレコード件数分、処理を繰り返す

3. 後続の5.にて「文字ごとに置換」ロジックによる拡張文字の置換に使用するため、 「変換元」レコードと「変換先」レコードをそれぞれ1行文字列として連結し、スクリプト変数に格納する

4. 変換処理対象のCSVファイルを読み込む

5. 上記4.で読み込んだデータを、後続の6.に出力するマッピングを行う
「文字ごとに置換」ロジックの[入力文字群]に変換元のスクリプト変数、[出力文字群]に変換先のスクリプト変数をそれぞれ設定し、マッピングを行う

※「文字ごとに置換」ロジックの設定内容
入力文字列中に、「入力文字群」のn番目と一致する文字がある場合、対応する「出力文字群」のn番目の文字に置換した文字列を出力します。
なお、入力文字列中に拡張文字が複数含まれる場合も、全てが置換対象となります。
本サンプルスクリプトでは、「入力文字群」と「出力文字群」に上記3.で格納したスクリプト変数をそれぞれ設定します。

6. 置換処理後の文字列を含むレコードをCSVファイルに出力する
補足
- 文字ごとに置換
コメント
0件のコメント
記事コメントは受け付けていません。