web-dev-qa-db-ja.com

utf-8を使用したphp substr()関数は、末尾にマークを残します

ここに簡単なコードがあります

<?php

$var = "Бензин Офиси А.С. также производит все типы жира и смазок и их побочных        продуктов в его смесительных установках нефти машинного масла в Деринце, Измите, Алиага и Измире. У Компании есть 3 885 станций технического обслуживания, включая сжиженный газ (ЛПГ) станции под фирменным знаком Петрогаз, приблизительно 5 000 дилеров, двух смазочных смесительных установок, 12 терминалов, и 26 единиц поставки аэропорта.";

$foo = substr($var,0,142);

echo $foo;
?>

そして、それは次のようなものを出力します:

БензинОфисиА.С. такжепроизводитвсетипыжираисмазокиихпобочныхпродук�...

幸運にもmb_substr()を試しました。これを正しい方法で行うには?

52
Nazar

サーバーでmbstringを有効にしている限り、上記のコメントは正しいものです。

$var = "Бензин Офиси А.С. также производит все типы жира и смазок и их побочных        продуктов в его смесительных установках нефти машинного масла в Деринце, Измите, Алиага и Измире. У Компании есть 3 885 станций технического обслуживания, включая сжиженный газ (ЛПГ) станции под фирменным знаком Петрогаз, приблизительно 5 000 дилеров, двух смазочных смесительных установок, 12 терминалов, и 26 единиц поставки аэропорта.";

$foo = mb_substr($var,0,142, "utf-8");

PHPドキュメントは次のとおりです。

http://php.net/manual/en/book.mbstring.php

100
Kai Qing

Unicode文字列の適切な(論理的な)代替。

<?php
function substr_unicode($str, $s, $l = null) {
    return join("", array_slice(
        preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));
}

$str = "Büyük";
$s = 0; // start from "0" (nth) char
$l = 3; // get "3" chars
echo substr($str, $s, $l) ."\n";    // Bü
echo mb_substr($str, $s, $l) ."\n"; // Bü
echo substr_unicode($str, $s, $l);  // Büy
?>

PHP:mb_substr-Manual を使用します

5
Botir Ziyatov

PHP5はUTF-8をネイティブに理解しません。 PHP6向けに提案されています(もし出てきたら)。

マルチバイト文字列関数 を使用して、UTF-8文字列を安全に操作します。

たとえば、あなたの場合はmb_substr()です。

3
thwd

文字列にUnicode(マルチバイト)文字が含まれている可能性があり、これらを分割したくない場合は、substrを必要に応じて次の2つのいずれかに置き換えます。

142文字に制限:

mb_substr($var, 0, 142);

142バイトに制限:

mb_strcut($var, 0, 142);
2
caw

UTF-8文字列のsubstr関数で定数を使用しないでください:$ st = substr($ text、$ beg、100); 50%の確率で、文字列の終わりに文字の半分が取得されます)

次のようにします:

$postion_degin = strpos($text, $first_symbol);
$postion_end = strpos($text, $last_symbol);
$len = $postion_end - $postion_degin +1;
$st = substr($text, $postion_degin, $len);

100%の結果

Mb_substrなし

2
usergio

strlen関数を使用して、返す文字列の長さを計算し、文字列$WordUTF-8エンコーディングを持っている場合、mb_strlen()を使用する必要があります関数:

$foo = mb_substr($Word, 0, mb_strlen($Word)-1);

1

このソリューションが私を大いに助けたので、あなたの助けになることを願っています。

<?php
if(mb_strlen($post->post_content,'UTF-8')>200){
    $content= str_replace('\n', '', mb_substr(strip_tags($post-> post_content), 
                          0, 200,'UTF-8'));
    echo $content.'…';
}else{
    echo str_replace('\n', '', strip_tags($post->post_content));
}
?>
0
Jodyshop