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

时间:2012-09-16 12:30:53

标签: php encoding utf-8 substring

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

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

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

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

我尝试过使用 substr和mb_substr ,然后获取

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

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

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

更新:我认为mb_substr无效,因为mb_detect_encoding() does not work properly

4 个答案:

答案 0 :(得分:17)

见以下网址:

从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í

答案 1 :(得分:7)

像往常一样,答案似乎就在这里。 (老实说,我已经搜索了大约一个小时)

(鉑) string functions and UTF8 in php的回答是:

  

确保设置正确的内部编码:mb_internal_encoding('utf-8');

使用 mb_internal_encoding('utf-8'); 一切正常。很抱歉打扰你们,谢谢你的帮助。

答案 2 :(得分:4)

试试mb_strcut() 它的行为与substr()相同,但它不会使最后一个字符被破坏 如果在您尝试剪切的位置,具有2个或更多字节的多字节字符,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: Лампа в вытяжке на кухне меняется, начиная с вытас

希望它有所帮助。

答案 3 :(得分:0)

mb_substr()不适合你吗?