私の perl パーサーが、仕様 (定義された各フィールドの開始、終了、長さ) に基づいてフラットな固定幅入力ファイルを読み取り、データベースにロードするコンマ区切りファイルを作成する状況があります。
入力ファイルは ISO-LATIN-1 または UTF-8 です。文字セットに関係なく、perl はコンマ区切りファイルを適切に作成しています (ISO-LATIN-1 から ISO-LATIN-1 へ、および utf8 から utf8 へ)。
ISO-LATIN-1 文字は 1 バイトしか占有しないため、問題はありません。ただし、データがデータベースにロードされた後、utf-8 が問題を引き起こしています。perl パーサーは入力データを読み取るときにバイト単位で処理するため、たまたま 40 バイト長のフィールドがあり、39、40、41 の位置を占める utf char がある場合、最初の 2 バイトのみがフィールドと同じものがデータベースにロードされています。
perl がこの文字列を読み取って、文字列の末尾にある不良バイトを削除する方法はありますか?
例: 6 バイトのフィールドがあり、char シーケンスが Â8ÄÂ で、バイト シーケンスが c382 38 c384 c382 (7 バイト) であるとします。perl パーサーがこのデータを解析すると、Â8Ä を取得しているように見えますが、バイト値を見ると c382 38 c384 c3 が抽出されています。末尾に半バイトの c3 があります。perl を使用してこの種の不良バイトを除去する方法はありますか?