- ベストアンサー
文字列(丸数字)の文字化けについて
今自分で関数を作成しているのですが、文字列(丸数字)の文字化けにかなり苦しんでいます。 (※注※)これ以降(1)など()の中に数字を入れて記述しているものは実際のソースコード上では丸数字で記入してます。教えてgooでは丸数字が記述できないようでして… 関数の内容としては、(1)あ(2)い(3)う……このように丸数字で区切られている文字列を配列名を$dataとすると、$data[0]には「あ」、$data[1]には「い」、$data[2]には「う」が入るような関数を作成しています。 この丸数字の数は(10)まで対応させようと考えてます。 実際のソースは function bunkai($str1){ if (strstr($str1, "(10)") != NULL){ define("kugiri","(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)"); // 区切り文字 }else if (strstr($str1, "(9)") != NULL){ define("kugiri","(1)(2)(3)(4)(5)(6)(7)(8)(9)"); // 区切り文字 }else if (strstr($str1, "(8)") != NULL){ define("kugiri","(1)(2)(3)(4)(5)(6)(7)(8)"); // 区切り文字 }else if (strstr($str1, "(7)") != NULL){ define("kugiri","(1)(2)(3)(4)(5)(6)(7)"); // 区切り文字 }else if (strstr($str1, "(6)") != NULL){ define("kugiri","(1)(2)(3)(4)(5)(6)"); // 区切り文字 }else if (strstr($str1, "(5)") != NULL){ define("kugiri","(1)(2)(3)(4)(5)"); // 区切り文字 }else if (strstr($str1, "(4)") != NULL){ define("kugiri","(1)(2)(3)(4)"); // 区切り文字 }else if (strstr($str1, "(3)") != NULL){ define("kugiri","(1)(2)(3)"); // 区切り文字 }else if (strstr($str1, "(2)") != NULL){ define("kugiri","(1)(2)"); // 区切り文字 }else if (strstr($str1, "(1)") != NULL){ define("kugiri","(1)"); // 区切り文字 } $count = 0; $token = strtok($str1, kugiri); while ($token) { $data[$count] = $token; $token = strtok(kugiri); $count++; } $data[$count] = NULL; return $data; } なんですが、 $str1に"(3)した(名)(4)しも(名)(5)もと(名)(6)さ-げる(動ガ下一)(7)さ-がる(動ガ下一)(8)くだ-る(動ラ五[四])(9)くだ-す(動サ五[四])(10)くだ-さる(動ラ五[四])"という文字列を入れて $dataを表示させてみると $data[0]=した(名) $data[1]=しも(名) ここまではできるのですが、これ以降 $data[2]=も� $data[3]=(名) $data[4]=さ-げる(動ガ下一) $data[5]=さ-がる(動ガ下一) $data[6]=く� $data[7]=-る(動� : : となってしまい、ところどころでうまく丸数字を読み込めていません。特に$str1に違う文字列をいれてみても(1)(2)(3)(4)まではきちんと読み込めてその後の(5)でまず最初の文字化けが絶対発生してしまいます。でも(5)を通過したあとの(6)(7)はきちんと判別していたりとよく原因がわかりません……。 がんばってexplode関数で同じようなことしてもいいかなと考えているのですが、関数自体が長くなってしまうので、めんどくさいなーと思います。 どなたか、このバグの原因がわかるかた、または、こんな関数を使ってこんなことしたら丸数字を判別して配列に入れることができるよーという意見もあったら欲しいです。 お願いします。困ってます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
じゃ、こんな感じで・・・ function bunkai($str1){ $data=explode('__SEPRATOR__',str_replace(Array("(1)","(2)","(3)","(4)","(5)","(6)","(7)","(8)","(9)","(10)"),'__SEPRATOR__',$str1)); array_shift($data); return $data; }
その他の回答 (2)
- mpx
- ベストアンサー率71% (149/209)
もしもshift-jisを使用しているのなら5c問題かもしれませんが マルチバイト文字を扱うのなら素直にマルチバイト文字列用の 関数を使用したほうが無難だと思います。 開示している関数は、下記2行で書けます $data=mb_split('[(1)-(10)]',$str1); array_shift($data); $dataが所望の配列になっていると思います 注)()数字は、○数字に変更のこと
お礼
mpxさんの言うとおり function bunkai($str1){ $data=mb_split('[(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)]',$str1); array_shift($data); return $data; } としてみましたが、うまく$dataに値が入りませんでした。 使い方が間違っているのでしょうか?やはり丸数字は使わないほうがいいのでしょうか…
- koke29
- ベストアンサー率58% (114/196)
丸数字が機種依存文字だからじゃないですか?? 使わないのが無難だと思います
お礼
yambejpさんのおっしゃるとおりに実行してみたらきちんとに判別されて配列に入りました。 ありがとうございます~!非常に助かりました!! このことで1日中悩んでいましたが、みなさんのおかげで解決しました~ありがとうございます~