• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文: "utf8"→ "sjis" の 文字化け・・・)

文字化けトラブル!utf8→sjisの問題と解決方法とは?

このQ&Aのポイント
  • utf8からsjisに変換する際に文字化けの問題が発生しています。Encode::encodeやJcode::convertを使用しても文字化けが発生し、結果を正しく表示することができません。Windows環境やブラウザ、メモ帳では正常に表示されていることを確認していますが、サーバー上では文字化けが発生します。
  • XPATHを使ってデータを取得し、シフトジスに変換すると文字化けが発生する問題があります。ローカルでは「?」になり、サーバー上では「?」の後に文字化けが発生します。また、Jcodeを使用してもローカルでは「??」、サーバー上では「〓」になります。
  • XPATHの値のみをファイルに書き込んでメモ帳で表示すると正常に表示されるため、Encode::encodeやJcodeの問題と思われます。しかし、正しい表示方法がわかりません。設定に関する情報をお持ちの方は是非教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ユニコード:FF5E シフトJIS:8160 がマッピングされていないことで起こることですね。 Perlの問題というより、 JAVAでも同様の問題が起こることから、 もともとそういう規定になっているのだと思います。(自信なし) メジャーな対処の方法があるかどうかは知らないのですが、 いったんUTF8上で、変換可能な文字並びに置き換えて、 シフトJIS変換後、変換し直すという方法はどうでしょうか use Encode; #~のUTF8生コードを%nami%に置き換える $data =~ s/\xEF\xBD\x9E/%nami%/g; #utf8からshiftjisに変換 Encode::from_to($data,"utf8","shiftjis"); #%nami%から~のシフトJIS生コードに置き換える $data =~ s/%nami%/\x81\x60/g; print $data;

noname#21216
質問者

お礼

他の文字がまざっていると $data =~ s/\xEF\xBD\x9E/%nami%/g; の正規表現は 置換されないようなので とりあえず use bytes; my $LenNami = length("\xEF\xBD\x9E"); while ((my $i = index($data,"\xEF\xBD\x9E",0)) >= 0) { $data = substr($data,0,$i).'%nami%' .substr($data,$i+$LenNami,length($data)-$LenNami) ; } no bytes; で置換しました。 $data =~ s/%nami%/\x81\x60/g; の式のほうはきちんと置換されます とりあえず解決しました  ありがとうございました。

noname#21216
質問者

補足

301Cとff5eと 2個あるんですね・・・ 置換を試してみましたが、 単独では置換できるのですが 他の文字が混ざっていると置換されません・・・ 正規表現で使えないような文字がまざっているのでしょうか・・・ 午前中格闘して疲れたので、また明日確認します

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

どっかでみたことあるなあと思っていたら、過去に同様の質問がありました。 http://okwave.jp/kotaeru.php3?q=1540626 こちらの方法でも良いと思います。

関連するQ&A