全角半角が混在している文字列の左から3文字を取得したい場合にいい方法はないでしょうか?

このQ&Aのポイント
  • mb_substr関数で最大3文字を切り出す方法がありますが、全角と半角ではバイト数の計算が異なるため、注意が必要です。
  • 英数字も含まれる場合は、元の文字列を壊さずに切り出すことができる方法を模索しています。
  • スマートな方法があれば、教えていただきたいです。
回答を見る
  • ベストアンサー

全角半角あわせて3文字

全角半角が混在している文字列の左から3文字を取得したい場合にいい方法はないでしょうか? mb_substr関数で第3パラメータはバイト数で指定するようです。 関数リファレンスでは「最大文字数」って表現になってます。 http://php.net/manual/ja/function.mb-substr.php 半角なら文字数=バイト数ですが、全角だと指定の半分の文字数になります。 最大だから間違ってはないですが、文字数じゃないよな‥‥っていつも思ってます。 いったん半角→全角にして、6バイト分を切り出すのはできます。 でも、英数字も全角半角混在してるので元の文字列を壊したくないのです。 mb_substrの第3パラメータを6から3まで、mb_strlenが3になるまで回すのもやってみました。 でも、なんかスマートじゃないんですよ‥‥。 なにかこう、スマートないい手はないでしょうか? よろしくお願いします。

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

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ファイルの文字コードと、mb_internal_encodingとmb_substrの指定文字コードを あわせてください バイト数ではなく文字数だとわかると思います <?PHP mb_internal_encoding("UTF8"); $str="abcあいうxyz"; $substr=mb_substr($str,2,3,"UTF8"); print $substr; ?>

ts3m-ickw
質問者

お礼

回答ありがとうです。 あれ‥‥? エンコード指定はあってるはずなのに、あってない? : : ホントだ、あってなかった。あれー? なぜ? すみません、ちょっと間抜けな自分に気が付いてしまいました。 ベストアンサーに選ばせてもらいます。

その他の回答 (1)

noname#242220
noname#242220
回答No.1

PCは『半角文字(一バイト)』の世界です。 文字コードを『ユニコード表記』にすれば取得出来るのでは?

ts3m-ickw
質問者

お礼

素早い回答をありがとうです。 おお、エンコードを変える発想はなかった‥‥UTF-32なら固定長でしたね。 BOMだけ考慮しておけば簡単にできそうな気がしてきました。 ちょっと試してみます。

関連するQ&A

  • 全角半角混在の文字列から○文字まで取得する方法

    はじめまして! MySQLから取得した文字列をPHPで例えば10文字まで表示したいのですが、良いやり方ありますでしょうか? 文字列には全角半角が混在しているので substr関数だと、うまく取得できない場合があります。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 全角半角考慮した文字列分割

    A列           B列         C列 あいうえおかきくけこ  あいうえ      おかきくけこ アイウエオカキクケコ   アイウエオカキクケ  コ あいうえオかきくけこ   あいうえオ    かきくけこ A列に全角半角混在のテキスト項目があります。 B列、C列に以下のルールで分割したいのですが、Excel関数で 実現可能でしょうか?可能な場合は式をご教授して 頂けますでしょうか。宜しくお願い致します。 ※全角をバイト数指定で分割して文字化けしないように 全角半角を考慮して分割したいと考えております。 B列  A列9桁目が半角の場合は半角9文字 A列9桁目全角の場合は半角8文字(全角4文字)をB列へ C列  A列10桁目が半角の場合は、左端10桁目~半角9文字 A列10桁目が全角の場合は、左端9桁目~半角9文字

  • エクセルの半角、全角

    エクセルで、半角文字、全角文字が混在するセルを関数等で全て全角にする(半角文字を全角文字に)方法はあるでしょうか?また、文字が1バイト文字か2バイト文字かを簡単に見分ける方法はありますか?

  • 全角半角を意識した文字分割

    A列           B列   C列  D列  E列     あいうえおかきくけこ  あ   いう  えお  か アイウエオカキクケコ    アイウ   エオ  カキ ク あイウえオかきくけこ    あ   イウえ  オか き 先ほど同じような質問を一度しているのですが、 A列に全角半角混在のテキスト項目があります。 B列、C列、D列、E列に以下のルールで分割したいのですが、 Excel関数で 実現可能でしょうか? 可能な場合は式をご教授して頂けますでしょうか。宜しくお願い致します。 ※全角をバイト数指定で分割して文字化けしないように全角半角を考慮して分割した いと考えております。 B列(半角3文字)  A列3桁目が半角の場合は半角3文字 A列3桁目全角の場合は半角2文字(全角1文字) C列 (半角4文字) A列4桁目が半角の場合は、左端4桁目~半4文字分 A列4桁目が全角の場合は、左端3桁目~半角4文字 D列(半角4文字) A列7桁目が半角の場合は、左端7桁目~半4文字分 A列7桁目が全角の場合は、左端6桁目~半角4文字 E列(半角2文字) A列11桁目が半角の場合は、左端11桁目~半2文字分 A列11桁目が全角の場合は、左端10桁目~半角2文字

  • substr で全角半角混在の文字列を抜くには…

    全角と半角の混ざった文字列で下のようにすると、1byte文字が混ざったときの最後の1文字が文字化けします。 $kensaku = substr($namae, 0, 10); 原因は分かったので色々なサイトを調べたのですが、頭がついてきません… 全角だけのときは10byte 半角が奇数混じったときは11byte 半角が偶数混じったときは10byte を$kensaku に渡すには どの様な記述をすればいいのでしょうか? 既出の質問で申し訳ございませんが、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 全角、半角、改行コードが混在文を指定文字数でカットしたい。

    こんにちは。 現在、phpで簡単な動的ページを作成しています。 行き詰っていますのは、文字列抽出?です。 ある文字列を先頭文字から300文字だけ切り出して以降はカットしてしまいたいのです。 但しその文字列が全角、半角、改行コード(EUC)が混在していまして、うまく切り出せません。 混在文字列からも文字列指定で切り出す関数や手段をご存知の方はいらっしゃいませんか? お手数では御座いますが、お教え下さい。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • CString型 全角半角を意識せずに「1文字」ずつ取り出す

    CString型の文字列に格納されている文字を1文字ずつ取り出したいです。 ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。 半角だけなら、str[0] str[1]...という風に取り出せますが、 全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。 その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。 CString ripString(CString str,int index){ //ソースとなる文字列、n文字目 /*~処理~*/ return 文字列; } たとえば"あaいbうcえdおe"という文字列を入れると、 CString str="あaいbうcえdおe"; ripString(str,0) →結果 "あ" ripString(str,1) →結果 "a" ripString(str,2) →結果 "い" ripString(str,3) →結果 "b"  ・  ・  ・   こういうことをするのに良い方法はありますか? 1バイトごとのそれぞれの文字自身が、 ・半角文字なのか ・全角文字の前1バイトなのか ・全角文字の後1バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。

  • 半角文字を全角文字に

    エクセル上で半角・全角文字が混在したデータを 数字は半角数字に、それ以外は全角文字にしたいのです。 教えてgooのwinのカテゴリーで似た質問をいくつか見つけたので、 試してみたのですが、JIS関数で全て全角にすることさえもできません。 やり方が悪いのでしょうか?それともmacでは無理なのでしょうか? 環境はOS9、Microsoft Excel(Microsoft Office 98)を使用しています。 エクセルは素人です。どうぞよろしくお願いします。

    • ベストアンサー
    • Mac
  • Ruby1.9で文字列中の全角文字数を調べたい。

    Ruby1.9を使っております。 次のような全角、半角が混在した文字列があり、その文字列の中から、 全角の文字数、半角の文字数がそれぞれ何文字あるか調べる方法はありますでしょうか。 ■文字列例 "あいイウう" どうか良きアドバイスをお願いいたします。

    • ベストアンサー
    • Ruby
  • 全角半角変換 C++/CLI

    C++/CLI(VC++2008) で (1)たとえば 東京bay を 東京bay にという風に全角半角混在の文字列のなかの半角文字を全角文字に変換するにはどうすればよろしいでしょうか (2)全角半角混在の文字列のなかの全角文字を半角文字に変換するにはどうすればよろしいでしょうか  

専門家に質問してみよう