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

tex*_*nic 18 php encoding substring utf-8

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

????? ? ??????? ?? ????? ????????, ??????? ? ???????????? ?????? ??????? ??????.

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

????? ? ??????? ?? ????? ????????, ??????? ? ?????.

我尝试过使用substr和mb_substr,然后得到

????? ? ??????? ?? ????? ???,即只有28个字符.

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

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

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

Abi*_*ain 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?
Run Code Online (Sandbox Code Playgroud)

例#2

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

echo utf8_decode($str3); 

// will output Feliz dí
Run Code Online (Sandbox Code Playgroud)

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

例#3

declare(encoding='UTF-8');

$str4 = "Feliz día";

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


// will output Feliz dí
Run Code Online (Sandbox Code Playgroud)

  • 虽然一切正常,但我最喜欢Example#3:最好使用单一功能.但是,`declare`手册说:"除非使用--enable-zend-multibyte编译php,否则在PHP 5.3中将忽略编码声明值.请注意,PHP不会公开是否使用了--enable-zend-multibyte来编译PHP除了phpinfo()之外." 我相信,我现在会坚持mb_功能. (3认同)

tex*_*nic 7

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

(铂)字符串函数和php中的UTF8的答案如下:

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

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

  • 正如我对OP的评论中所提到的,我确信`mb_substr($ string,0,50,"UTF-8")`也会有效,但我很高兴你找到了解决方案(嘿,如果你在很多不同的地方使用`mb_substr`,这是一个更好的解决方案!) (2认同)

Sla*_*ser 6

试试mb_strcut()
它的行为与 相同substr(),只是它不会留下最后一个字符被破坏。
如果在您试图切出的位置,有一个 2 个或更多字节的多字节字符,mb_strcut()则不会将该字符切割成碎片,而是会忽略该字符。

例如,如果您试图从 string 中删除 50 个字节????? ? ??????? ?? ????? ????????, ??????? ? ???????????? ?????? ??????? ??????.mb_strcut()则不会将字符切?成两半,但会将其从结果中删除。

$str = "????? ? ??????? ?? ????? ????????, ??????? ? ???????????? ?????? ??????? ??????.";

echo mb_strcut($str, 0, 50);
// Prints: ????? ? ??????? ?? ????? ??

echo substr($str, 0, 50);
// Prints: ????? ? ??????? ?? ????? ???

echo mb_substr($str, 0, 50);
// Prints: ????? ? ??????? ?? ????? ????????, ??????? ? ?????
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。