¥マークの削除の仕方をヘルプ…

Mysqlのデータをphpから表示していますが、
改行コード¥n¥rがそのまま表示されてしまい、変換しようと以下のようにしましたが変換がききません。
$str = str_replace("\n\r",'<br>', $str)
$str = str_replace("\\n\\r",'<br>', $str)
それ以外も試したところ数値やアルファベットは変換できるものの日本語になると変換出来ませんでした。ソースはutfで書いてます。

多分原因ですが、DB内の値が、元々sjisで保存されていたのが、サーバ移動がありutf8に変換されました。
どんな手順で変換されたかはわからないのですが、\n\r以外はutf8で正常に表示はされます。
改行コードだけがsjisの値で保存されてる?のかもしれません。
ちなみにphpmyadminで見るとそのまま¥n¥rと表示されます。
しかしutf8のデータにはなってるのでsjisで表示させても文字化けしますし、
その変数だけsjisにmb_convertしてからstr_replaceしても効きませんでした。
こういった場合どのような方法があるでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/01/14 12:50:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:cafet

質問者から

cafet2013/01/13 18:28:36

julyさんありがとうございます。ご指摘のとおり\r\nでした。

ここに手打ちしたとき間違えたようで、あらためて確認しても出来ませんでした。

ちなみにstr_replace('\\r','
',$str) 等と分けても変化なしでした。

また、日本語は置換出来ないと思ったのは勘違いで日本語はstr_replaceで普通に置換できました。\マークだけ出来ません。r一文字だけの置換も出来ました。

ベストアンサー

id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ポイント60pt

> 改行コードだけがsjisの値で保存されてる?のかもしれません。
改行文字は Shift_JIS も UTF-8 も同じです。

> 改行コード¥n¥rがそのまま表示されてしまい
ブラウザ上(あるいはソース上)に ¥ が見えるとしたら、改行コードではなくなってしまっています。

> r一文字だけの置換も出来ました。
これからも、データ上は改行コードではなくなってしまっている可能性が窺えます。

> サーバ移動がありutf8に変換されました。
この時に意図しない変換が行われたのかもしれません。
Shift_JIS では(日本だけ)円マークとバックスラッシュ同じ扱い(コード 5C )ですが UTF-8 では全く違う文字ですし。
ただし、改行文字を勝手に別なものに置き換えるような事は余程変な事をしないとあり得ないですが。
DBに改行文字ではなく、¥n のように2つの文字( ¥r¥n なら4つの文字)として格納されるという変な変換(エスケープ?)が行われていたら、可能性が無くもない...

phpMyAdmin をお使いなら、
全データをエクスポートして(=SQL化して)ダウンロード
円マークとバックスラッシュを区別できるエディタで必要な所を修正
SQLの実行で修正後のファイルを指定して実行
の様な手順でゴッソリ入れ替えてやる事で、対応できそうに思います。
__円マークとバクスラッシュを区別できないエディタでもうまくいくかもしれません...

エクスポートする時に、 DROP のオプションを付けておくと、重複データが登録すされることもないです。

id:cafet

phpmyadminで、\r\nが入ってる項目に手打ちで\r\nと入れたところ
最初からのは¥マークで表示されて手打ちはバックスラッシュで表示され
手打ちのほうはstr_replaceで変換できました。
エクスポートしたところ最初から入ってる\r\nが置換出来そうでしたので
それで対応したいと思います。
古いmysqlからの移動だったので変わった変換がかかってたのかもしれないです。
皆さんありがとうございました。

2013/01/14 12:56:50

その他の回答1件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント40pt

UTF-8のテキストとして \n\t と記録されてしまっているのでしょう。
下記のコードで変換してください。

<?php
$str = preg_replace("/\\r\\n/u", '<br />', $str);
?>
id:cafet

ありがとうございます。
そのようにしてみたのですが変わりませんでした。
$str = preg_replace("/日本語/u", '
', $str);
等とすると変換はされました。
何かやり方がおかしいのでしょうかね…。

2013/01/13 19:03:31
id:tezcello No.2

回答回数460ベストアンサー獲得回数69ここでベストアンサー

ポイント60pt

> 改行コードだけがsjisの値で保存されてる?のかもしれません。
改行文字は Shift_JIS も UTF-8 も同じです。

> 改行コード¥n¥rがそのまま表示されてしまい
ブラウザ上(あるいはソース上)に ¥ が見えるとしたら、改行コードではなくなってしまっています。

> r一文字だけの置換も出来ました。
これからも、データ上は改行コードではなくなってしまっている可能性が窺えます。

> サーバ移動がありutf8に変換されました。
この時に意図しない変換が行われたのかもしれません。
Shift_JIS では(日本だけ)円マークとバックスラッシュ同じ扱い(コード 5C )ですが UTF-8 では全く違う文字ですし。
ただし、改行文字を勝手に別なものに置き換えるような事は余程変な事をしないとあり得ないですが。
DBに改行文字ではなく、¥n のように2つの文字( ¥r¥n なら4つの文字)として格納されるという変な変換(エスケープ?)が行われていたら、可能性が無くもない...

phpMyAdmin をお使いなら、
全データをエクスポートして(=SQL化して)ダウンロード
円マークとバックスラッシュを区別できるエディタで必要な所を修正
SQLの実行で修正後のファイルを指定して実行
の様な手順でゴッソリ入れ替えてやる事で、対応できそうに思います。
__円マークとバクスラッシュを区別できないエディタでもうまくいくかもしれません...

エクスポートする時に、 DROP のオプションを付けておくと、重複データが登録すされることもないです。

id:cafet

phpmyadminで、\r\nが入ってる項目に手打ちで\r\nと入れたところ
最初からのは¥マークで表示されて手打ちはバックスラッシュで表示され
手打ちのほうはstr_replaceで変換できました。
エクスポートしたところ最初から入ってる\r\nが置換出来そうでしたので
それで対応したいと思います。
古いmysqlからの移動だったので変わった変換がかかってたのかもしれないです。
皆さんありがとうございました。

2013/01/14 12:56:50
  • id:JULY
    \n\r ではなく、\r\n では?
  • id:TransFreeBSD
    試しにsubstrで切り出してord使って\の所の文字コードを確認してみたらどうでしょう?
    普通の円記号というかASCIIでいうバックスラッシュならば92になります。
    もし改行文字なら10(\r)と12(\n)、unicodeでいうバックスラッシュと違う円記号なら165になります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません