我(在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。
答案 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()不适合你吗?