[PHP-dev 1235] Re: ISO-2022-JPでmb_strcutを使ってみる

MORIYAMA Masayuki moriyama @ miraclelinux.com
2006年 3月 29日 (水) 11:07:14 JST


森山です。

MORIYAMA Masayuki <msyk @ mtg.biglobe.ne.jp> wrote:

> PHP のソースコードを見ていないので確かなことは言えませんけれども、
> mb_strcut で ISO-2022-JP を適切に処理出来ていないのではないでしょうか。
> 
> On Mon, 27 Mar 2006 11:49:00 +0900
> Tadashi Jokagi <ml @ elf.no-ip.org> wrote:
> 
> >       ぢょ〜@よくきたなです.
> >       ボケていました.ありがとうございます.で,修正したのですが,文
> >     字が 1 文字消えてしまいました.

mb_strcut で ISO-2022-JP を処理させた場合の動作は、仕様と考えた方がい
いようです。

次のように、ISO-2022-JP 文字列を mb_strcut で処理する場合、開始位置
(start) が必ず 0 になるようにする事で、文字消失の問題は発生しなくなり
ます。

以下は、あくまでもサンプルです。
動作保障はしませんので、実際に使用する場合は、動作確認して問題があれば
修正して使うようにしてください。
---------------------------------------
<?php
// EUC-JPで記載

define( "INTERNAL_ENCODING", "EUC-JP" );
define( "CONVERT_ENCODING", "ISO-2022-JP" );
define( "SPLIT_LEN", 43 );

$String  = "あいうえおかきくけこさしすせそたちつてとなにぬねの";
$String .= "アイウエオかキクケコサシスセソタチツテトナニヌネノ";
$String .= "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
$String .= "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";

$Chunk = $String;
$Rows = array( );
$Size = 0;

do {
  $Chunk = substr( $Chunk, $Size );
  $Chunk_conv = mb_convert_encoding( $Chunk, CONVERT_ENCODING, INTERNAL_ENCODING );
  $Buffer = mb_strcut( $Chunk_conv, 0, SPLIT_LEN, CONVERT_ENCODING );
  $Rows[] = $Buffer;
  $Size = strlen( mb_convert_encoding( $Buffer, INTERNAL_ENCODING, CONVERT_ENCODING ));
} while (strlen($Chunk) != $Size);

print_r( $Rows );

?>
---------------------------------------

--
森山 将之 moriyama @ miraclelinux.com
ミラクル・リナックス株式会社



PHP-dev メーリングリストの案内