• ベストアンサー

半角カタカナ2文字を入力すると

教えてください。 フォームから受け取って、下記の、処理をしています。 「半角カタカナ2文字を入力」すると、下記の現象になります。 この場合どのようにするのか、誰か教えてください。 [プログラム] $str = mb_convert_kana($str, "KVC"); $str = mb_convert_encoding($str,"SJIS","auto"); echo $str; [例] 1文字の場合 : 半角 ス → ス 2文字の場合 : 半角 スシ → 充 3文字の場合 : 半角 スシス → スシス

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

HTMLのエンコーディングとPHPの内部エンコーディングを別にするなどの特殊なケースを除けば、そもそも文字コード変換などする必要はありません。昔のブラウザ(Netscape 4.Xなど)は、まれにおかしなエンコーディングでPOSTやGETパラメータを送ってくることがありましたが、最近主流のブラウザはそんなことはないからです。 HTMLとPHPの内部エンコーディングが一緒である場合、PHPの設定は以下のようにします。 default_charset = ご使用のエンコーディング ;output_handler (コメントアウトする) mbstring.encoding_translation = Off mbstring.internal_encoding = ご使用のエンコーディング 半角カナを全角カナにしたい場合は、 $str = mb_convert_kana($str, "KV"); とします。 HTMLはSJIS、PHPの内部エンコーディングはEUC-JPなど、文字コードを別にしたい場合は、以下のように設定します。 default_charset = HTMLのエンコーディング output_handler = mb_output_handler mbstring.encoding_translation = On mbstring.http_input = HTMLのエンコーディング mbstring.http_output = HTMLのエンコーディング mbstring.internal_encoding = PHPのエンコーディング

ni1ni2ni3
質問者

お礼

ご回答ありがとうございます。 php設定を回答通りに設定した所、うまく動きました。 これで、次の処理に進めそうです。 ありがとうございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

短い文字列を渡しての文字コードの自動判別は当てにならないと考えたほうがよいです。 ShiftJISでの半角かなのスシをビットパターンで見ると E:\it>echo スシ|hexdump 00000000: BD BC 0A であり(上記は実際には半角かなです)、これはEUC-JPで見ると E:\it>echo スシ|nkf -E -s 充 となります。 奇数バイト渡したときにうまくいっているように見えるのは、そういう構成の EUC-JPでの文字列がありえないからでしょう。 何らかの手段で入力のエンコーディング情報を得るようにしたほうがよいと思います。

ni1ni2ni3
質問者

お礼

ご回答ありがとうございます。 下記の通りテストしています。 「EUC-JP」にすると半角カナは出来ますが、全角文字が文字化けしてしまいます。 どのようにしたら、いいのでしょうか? [プログラム] $moji_code = mb_detect_encoding($str); switch ($moji_code){     case "ASCII":       echo "$moji_code<BR>\n";       echo "$str\n";       break;     case "SJIS":       「EUC-JP」にすると出来ますが、全角が文字化けしてしまいます。       $str = mb_convert_encoding($str,"EUC-JP","SJIS");       echo "$moji_code<BR>\n";       echo $str;       break;     case "EUC-JP":       echo "$moji_code<BR>\n";       echo "$str\n";       break; }

関連するQ&A

  • 文字列のエンコードについて

    例えば以下のコードで日本人がターゲットのサイトを作ったときにエンコードがutf8以外ってありますか?idなどもutf8でなんとかなるのになぜ他の文字コードは必要なのですか? //SJISに変換 $str = "私のidはrxxdtggb63332224667です。"; $result = mb_convert_encoding($str, "SJIS"); echo $result . "\n"; //UTF-8に変換 echo mb_convert_encoding($str, "UTF-8"); //SJISに変換 $str = "gcdddyyghgcc.jpg"; $result = mb_convert_encoding($str, "SJIS"); echo $result . "\n"; //UTF-8に変換 echo mb_convert_encoding($str, "UTF-8");

    • ベストアンサー
    • PHP
  • phpでの文字エンコード

    携帯用のHPを作っているのですが、データベース文字コードがEUC-JPの為、一部の携帯では正常に表示されないでいます。 それで文字コードをShift_JISに変換してから出力したいのですが、 同時にmb_convert_kanaを使って全角カナを半角にしたいとも考えています。 個別に変換するなら、 $str = mb_convert_kana($row["~"],"k"); print mb_convert_encoding($str,"SJIS","EUC-JP"); で良いかと思うのですが、 ページ全体の出力文字を一気に変換する方法がわからないでいます。 そのような方法はあるのでしょうか? どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • 半角カタカナの入力チェックを作りたいです

    入力フォームで入力された文字に対して半角カタカナかチェックをしたいです。 function CheckHalfSizeKatakana($str) {  if (mb_ereg("^[ア-ン゛゜]+$",$str)) {    return true;  } else {    return false;  } } としたのですがうまくいきません。 PHP4です。

    • ベストアンサー
    • PHP
  • カタカナの文字列を検出する関数

    function iskanamoji($str) { $str=mb_convert_kana(mb_convert_kana($str,"KV"),"A"); if(mbereg('^([ァ-ヶ]|[ー])*$',$str))return true; return false; } を作りましたがUTFー8で機能しません。 どのように直したらよいでしょうか?

    • ベストアンサー
    • PHP
  • php4での文字化け

    php4で以下のプログラムを実行したら、IEの設定で文字コードをどれにしても文字化けします。 文字化けしない方法はあるのでしょうか? よろしくお願いします。 <?php $str = "あいうえお"; $str = mb_convert_kana($str,"KV"); echo "$str\n"; ?>

    • ベストアンサー
    • PHP
  • mb_convert_encodingの文字数

    質問させていただきます。 半角256文字以上の文章を以下のように表示させようとしています。 mb_convert_encoding($str,"UTF-8","SJIS") これで文字列を表示させようとすると文字が256文字で途切れてしまいます。 文字列を256文字以上で、文字数制限なく、表示させる方法を 探しています。どなたかわかる方いたら教えてください。

    • ベストアンサー
    • PHP
  • PHPで指定文字数で切りたい場合

    PHPで、全角と半角の混在した文字列で 全角=1文字、半角=0.5文字として換算した文字数を切り詰めたい場合は どうすれば良いのでしょうか?? 改行コードなどもカウント出来たら尚良いです! 環境は PHPのソースコードはutf-8 入出力はShift-jis ・mb_substrは、半角も1文字とカウントされてしまいます ・mb_strimwidthは、文字幅なので今回は使い物になりません ・mb_strcutはなぜかうまく動いてくれません $str = mb_convert_encoding($str,'shift-jis','utf-8'); $str = mb_strcut($str,0,1000,'shift-jis'); $str = mb_convert_encoding($str,'utf-8','shift-jis'); 500文字になるのを期待したが、出力された文字は512文字になってしまった 全角=1文字、半角=0.5文字の検証は以下のサイトにて行いました http://www.luft.co.jp/cgi/str_counter.php お忙しい中恐縮ですが、 わかる方お教えくださいませ!

    • ベストアンサー
    • PHP
  • 機種依存文字の除去

    現在PHP,EUC-JP環境にてプログラミングをしているのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1432515 を参考にして機種依存文字の除去にチャレンジしています。 $str = mb_convert_encoding($str,'SJIS','EUC-JP'); $str = preg_replace( "/([\x87][\x40-\x9F]|[\xED-\xEE][\x40-\xFC]|[\xFA-\xFC][\x40-\x4B]|[\xF0-\xF9][\x40-\xFC])/" ,"",$str); $str = mb_convert_encoding($str,'EUC-JP','SJIS'); で機種依存を試しているのですが、うまくいきません。 ところどころ?+半角文字になったり、機種依存文字は?になったりします。 EUC-JPで機種依存文字を除去できる方法であれば上記の方法にこだわりません。 どなたかご教授いただけないでしょうか? よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 文字コードの検出が正しいかを検証する方法

    PHPの mb_detect_encoding 関数を使っているのですが、 文字エンコーディングの検出が間違っていないかを検証する為に、 以下のように、検出された文字コードに戻し、元の文字列と一致するかで、 検出された文字エンコーディングが正しかったか確認しています。 $str = file_get_contents ( $url ); $moji_code = mb_detect_encoding ( $str , "ASCII,JIS,UTF-8,eucJP-win,SJIS-win" ); $str_after = mb_convert_encoding ( $str , 'UTF-8' , $moji_code ); if ( $str !== mb_convert_encoding ( $str_after , $moji_code , 'UTF-8' ) ) {     //文字化けしている可能性あり } これで、完璧でしょうか?

    • ベストアンサー
    • PHP