php4 SJISの環境で2バイト文字の扱い方

このQ&Aのポイント
  • php4 SJISの環境で2バイト文字の扱いで悩んでいます。4バイト以内に正しく収める方法はありますか?
  • $test変数には「あaいbうえ」という文字があります。4バイト以内に正しく収める場合、次の4バイト取得時に読まなかった分から始めて取得する方法はありますか?
  • mb_系の関数は文字数で判定するため、今回の目的で使えません。何か良い方法はありますか?
回答を見る
  • ベストアンサー

php4 SJISの環境で2バイト文字の扱い方

php4 SJISの環境で(漢字など全角)2バイト文字の扱いで悩んでいます。 $test = "あaいbうえ"; $toru1 = substr($test, 0, 4); $toru2 = substr($test, 4, 4); $toru3 = substr($test, 8, 4); という文字があり、これを盲目的(0,4,8と)4バイト取得すると、あa*<-変てこな文字になります。 4バイト以内に正しく収めて(全角が真っ二つされる場合はこの場合は全角文字の1文字を読まずに3バイトに収めて)次の4バイト取得時に読まなかった分から始めて取得するような器用なことをさせたいです。 結果としては、以下のようにさせたいです。 $toru1 = "あa"; // 4バイト以内 $toru2 = "いb"; // 4バイト以内 $toru3 = "うえ"; // 4バイト以内 mb_系は文字数なので、今回のバイト内に収めることでは使えないと思います。(バイト内に収めることが今回の目的です。) 何か良い方法はありますか?

  • ne5
  • お礼率4% (5/124)
  • PHP
  • 回答数1
  • ありがとう数1

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

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

自分もメールの chunk_split に mb版が欲しいと思っていました。 で、次のようなコードはどうでしょう。 <?php /** * Chunks a multibyte string to array of strings, each string is at most specifiled length in bytes. * * @param string $str Original string * @param int $chunkbyte Length of each chunk in bytes, should be longer than one multibyte character * @param strin $encoding Encoding of the input/output string */ function mb_byte_chunk_to_array($str, $chunkbyte = 76, $encoding = null){ $ret = array(); $pos = 0; $len = strlen($str); if(!$encoding){ $encoding = mb_internal_encoding(); } while(true){ $buf = substr($str, $pos, $chunkbyte); $buf = mb_convert_encoding($buf, $encoding, $encoding); if($buf == ''){ // for cases chunkbyte is too small $buf = substr($str, $pos); $buf = mb_substr($buf, 0, 1, $encoding); } if($buf == ''){ // reached to the end of string. break; } $pos += strlen($buf); $ret[] = $buf; } return $ret; } print_r(mb_byte_chunk_to_array("これは1つのテストです。", 5)); ?>

関連するQ&A

  • VB6での文字コードダンプ

    VB6を使用して文字のダンプを取得したいのですが、UNICODE→SJIS変換しての バイト長を取得するものはよく見かけるのですが、全角文字の文字コードの取得法は、調べてはいるのですがなかなか見つかりません。 行いたいことは、全角の"あ"の場合、0x82、0xa0のように SJISでの1バイト毎の16進(10進でも可)の文字コードを 取得したいということです。 よろしくお願いします。

  • PHP 文字列抽出

    はじめまして。PHPプログラミングの初心者で恐縮ですが、 ご質問させてください。 現在、携帯用HPを作成してPHPによりMYSQLからデータを 表示させるプログラミングを組んでいます。 そこで、DB(MYSQL)からデータを引っ張ってくる際に、 そのデータが長い場合には、 頭から10バイトを抽出して末尾に「…」を追加して 表示させるプログラミングを作成したいと考えております。 ところが、そのデータに半角文字が含まれ最後の10バイト目が 全角の場合、文字化けをしてしまいます。 ------------------------------------------- 例) 〔データ〕  あいaうえおか(23バイト)       ↓(substrにより10バイトを抽出して末尾に…を追加)  あいaうえ●… ●部分が文字化けする ------------------------------------------- 文字列の「お」の部分を1バイトで抽出している為、 文字化けしてしまっていると思いますが、 うまく「お」まで表示するか、もしくは「お」を 表示し

    • 締切済み
    • PHP
  • 全角半角あわせて3文字

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

    • ベストアンサー
    • PHP
  • PHP 文字列抽出

    はじめまして。PHPプログラミングの初心者で恐縮ですが、 ご質問させてください。 現在、携帯用HPを作成してPHPによりMYSQLからデータを 表示させるプログラミングを組んでいます。 そこで、DB(MYSQL)からデータを引っ張ってくる際に、 そのデータが長い場合には、 頭から10バイトを抽出して末尾に「…」を追加して 表示させるプログラミングを作成したいと考えております。 ところが、そのデータに半角文字が含まれ最後の10バイト目が 全角の場合、文字化けをしてしまいます。 ------------------------------------------- 例) 〔データ〕  あいaうえおか(23バイト)       ↓(substrにより10バイトを抽出して末尾に…を追加)  あいaうえ●… ●部分が文字化けする ------------------------------------------- 文字列の「お」の部分を1バイトで抽出している為、 文字化けしてしまっていると思いますが、 うまく「お」まで表示するか、もしくは「お」を 表示しないようにプログラミングをしたいのですが、 どのように組めばよいかわかりません。 非常に初歩的なご質問で恐縮ですがご教授頂けると ありがたく思います。 どうぞよろしくお願い致します。

    • 締切済み
    • PHP
  • IE6で文字化け します。

    IE6で文字化け します。 以下のURLが、IE6で文字化けします。(IE8やMozillaでは正常です) http://cgi.geocities.jp/rhcpf907/fml2tex/?%BC%B0%A1%E3%20%A6%B2_{n=1}^N%20a_n%20%A6%B7_n%A1%A2%A6%B2_{m=1}^M%20b_m%20%A6%B5_m%20%A1%E4%20%A1%E1%A6%B2_{n=1}^N%A1%A1%A6%B2_{m=1}^M%A1%A1a_n^{*}b_m%20%A1%E3%A6%B7_n%A1%A2%A6%B5_m%20%A1%E4 IE8と見比べて頂けるとわかるのですが、<や> がおかしくなります。 回避策がありましたら、お教え下さい。 プログラムは、以下です。  $qstr = rawurldecode($_SERVER["QUERY_STRING"] );   :   :   if (strlen($qstr) <= 2){     return 'CanNotEncode';   }   // 自動検出   $encd = mb_detect_encoding($qstr, 'EUC-JP,SJIS,UTF-8,JIS');   if ($encd != ''){     $expr = mb_convert_encoding($qstr,"SJIS", $encd);     if ( mb_substr('式',0,1,'SJIS') == mb_substr($expr,0,1,'SJIS') ){       return $expr;     }   }   // Yahooブログ(EUC-JP) だけは救う   $expr = mb_convert_encoding($qstr,"SJIS", 'EUC-JP');   if ( mb_substr('式',0,1,'SJIS') == mb_substr($expr,0,1,'SJIS') ){      return $expr;   }   return 'EncodeFail ['.substr($qstr,0,8).']'; }   :   : // $exprから"式”を取り去って全角→半角にして MineTeX.cgi に渡す

    • ベストアンサー
    • PHP
  • awkでバイト数を方法

    文字列$2を300文字まで切り取る方法は substr($2,1,300)ですが、 全角半角が混在している文字列を 先頭から300バイト取得する方法が分かりません。 お手数をおかけしますが、 ご教授願いします。

  • 文字列の先頭から指定バイトだけ取得

    質問があります。 1バイト文字が来ても2バイト文字が来ても 表示時に視覚的に同じ長さを返す関数が作りたいのですがうまくいきません。 $str1 = "あああaあ"; $str2 ="aaaaaaaaa"; function hoge($str) { return mb_substr($str, 0, 5); } これだと表示した場合に あああaあ aaaaa となってしまいます。 mb_substrをsubstrにすると2バイト文字の途中をsubstrで指定してしまうと文字化けしてしまいます。 何かうまい回避方法はないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Excelで22バイトの文字を数えたい

    Excel2002です。 VBAでセルの文字列を取得する時に全角制御文字(2バイト)を含めて22バイトの制限を考慮したいのですがその方法がわかりません。 全角文字だけなら10文字、  半角文字だけなら22文字の取得ができます。 その後の作業の都合上、22バイトを基準に条件判断したいのですが現在はその方法がわからないためLEN()で10を上限としています。LENB()でも同じ結果(文字数が返される)になります。 対象のセルには全角文字/半角文字が混在しており、全角-半角-全角-半角のような混在であれば制御文字を2回考慮する必要があります。 最悪その文字が全角か半角かの区別がつけば対応できると思います。 よい方法をご教授いただきたくお願いいたします。

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

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

    • ベストアンサー
    • PHP
  • SJIS→UTF-8の文字コード変換

    Perlで、SJISの16進で表記された文字があるのですが、それがうまく表示できません。 Unicodeの16進文字コードだとうまく表記できるのですが…。 以下がスクリプトです。 以下の場合だと。(句点)がSJISだと0x8142で、 その16進文字列を表示したいのですが、実行結果にあるエラーが出てしまいます。 Unicodeだと。は0x3002なのですが、うまく表示できています。 すみませんがよろしくお願いします。 ---------------------------------------- # このファイルの文字コードはSJIS # 改行コードはLF # # 。 SJIS 0x8142 # Unicode 0x3002 # use Jcode; use encoding "sjis"; $a = 0x8142; $a = Jcode->new($a, "sjis")->utf8; printf("句点の表示…%c\n",$a); printf("句点の表示…%c\n",0x3002); ---------------------------------------- 実行結果 "\x{8142}" does not map to shiftjis at test.pl line 14, <DATA> line 846. 句点の表示…\x{8142} 句点の表示…。

    • ベストアンサー
    • Perl

専門家に質問してみよう