10/05/22 17:06:03
皆さんレスありがとうございます。
>>405はmeadowから打ち込んだ~は\x{301c}となり、
notepad等から打ち込んだ~は\x{ff5e}になる事が原因で表示に失敗していました。
\x{301c}はshift_jisでは表示に成功しcp932では失敗しました。
\x{ff5e}はcp932では表示に成功しshift_jisでは失敗しました。
どうやらeucとsjisの~はutf8の\x{301c}に対応していて
cp932の~はutf8の\x{ff5e}に対応しているようでした。
なので例えばeucの~をutf8に変換し、それをcp932に変換すると失敗するようです。
挙動がおかしいと思った元のプログラムではネット上にあるeucのページを取ってきて
utf8に変換し出力時にcp932に変換していたので上記の理由で文字化けしていた様です。
そこでeucをutf8に変換した際に\x{301c}を\x{ff5e}に変換するようにしました。
$utf8data =~ tr/\x{301c}/\x{ff5e}/;
そうしたところprintした際に"\x{301c}" does not map to cp932というエラーも出ず、無事~が表示されるようになりました。