PHP:是否可以正确地 SUBSTR 一个 UTF-8 字符串?

2022-08-30 19:50:37

我有(在SQLite数据库中)以下字符串:

Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа.

PHP 使用 正确显示该字符串。我只想获得这个字符串的前50个字符,即print

Лампа в вытяжке на кухне меняется, начиная с вытас.

我尝试同时使用子字符串和mb_substr,并得到

Лампа в вытяжке на кухне ме�,即只有 28 个字符。

在阅读了这里和其他地方关于mbstring问题的内容后,我意识到这实际上是一个50字节的字符串(22个俄语字符= 44个字节加5个空格加1个问题符号)。

有什么好的解决方案吗?我所有的字符串都是UTF-8,所以我当然可以自己编程一个子str函数,通过检查每个字节的第一位等。但这肯定应该以前做过,对吧?

更新:我认为无法正常工作,因为无法正常工作mb_substrmb_detect_encoding()


答案 1

请参阅下面的网址:

从 PHP 中的 UTF-8 字符串中提取子字符串

http://osc.co.cr/extracting-a-substring-from-a-utf-8-string-in-php/

使用 UTF-8 的 PHP 子字符串

http://greekgeekz.blogspot.in/2010/11/php-substring-with-utf-8.html

或者试试看:

示例 #1

$str1 = utf8_encode("Feliz día");

$str2 = substr($str1, 0, 9);

echo utf8_decode($str2); 

// will output Feliz d�

示例 #2

$str3 = mb_substr($str1, 0, 9, 'UTF-8');

echo utf8_decode($str3); 

// will output Feliz dí

从 PHP >= 5.3 开始,您还可以声明编码指令并使用 substr 函数

示例 #3

declare(encoding='UTF-8');

$str4 = "Feliz día";

$str5 = substr($str4, 0, 9);echo $str5;


// will output Feliz dí

答案 2

请尝试 mb_strcut())。
它的行为与 相同,只是它不会让最后一个字符被破坏。
如果在您尝试剪切的位置,具有2个或更多字节的多字节字符,则不会将字符切成碎片,但会忽略此字符。substr()mb_strcut()

例如,如果您尝试从字符串中切出50个字节,则不会将字符切成两半,但会将其从结果中消除。Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа.mb_strcut()н

$str = "Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа.";

echo mb_strcut($str, 0, 50);
// Prints: Лампа в вытяжке на кухне ме

echo substr($str, 0, 50);
// Prints: Лампа в вытяжке на кухне ме�

echo mb_substr($str, 0, 50);
// Prints: Лампа в вытяжке на кухне меняется, начиная с вытас

希望它有帮助。


推荐