0

mb_* 関数を使用して、文字列内のスペースを見つけようとしています。ラテン文字では機能しますが、中国語では機能しません...他のスレッドがこれが問題である可能性があることを示唆しているため、utf8_encode と iconv を utf-8 にしようとしました。

エラーを与える関数は mb_strpos で、中国語では何も返しませんが、英語やその他のラテン文字ベースのテキストでは有効な int を返します。

私はエンコーディングにそれほど強いわけではありませんが、別のエンコーディングがこの問題を引き起こしていると思います。そのため、php-functionsには何も問題がないように見えるため、どこを検索すればよいかについて、私は何よりも助けを求めています。

これは、mb_strpos までは英語と中国語の両方で機能します。

// TEST THAT DID NOT WORK
//$text=iconv('ISO-8859-1','utf-8',$text);//that's NOT a solution!
//$text=utf8_encode($text);//that's NOT a solution!

// Set vars
$len = 150;


// Next to code lines are OK for both English AND Chinese
// get substring based on $len, then get length of string. Both in multibyte
$text_cropped = mb_substr($text,0,$len,'UTF-8'); // works for English AND Chinese
$string_cropped_length = mb_strlen ($text_cropped,'UTF-8');

// mb_strpos only works for English, but not for Chinese
//find last space within length in multibyte
$last_space = mb_strpos ( $text , ' ', $string_cropped_length, 'UTF-8');

// Hack to only use $last_space if mb_strpos did work
// there is an error in mb_strpos based on php version. It may return empty for chinese chars

// a work around until php upgrade is test for value of last_spave and do an if-else
if(intval($last_space) > 0) {
    $text_cropped_final = mb_substr($text,0,$last_space,'UTF-8');
} else {
    $text_cropped_final = $text_cropped;
}

return $text_cropped_final . '...';
4

0 に答える 0