如何逐个字符处理含变音符号的UTF-8德语句子并反转单词?
解决德语含变音符号的单词反转问题
问题根源
PHP默认字符串操作是字节级的,而UTF-8编码的德语变音符号(ä, ö, ü, ß等)占2-3个字节,直接用strrev()反转会拆分多字节字符导致乱码;同时preg_split默认不支持UTF-8字符集,分割单词时也容易出错。
解决方案步骤
1. 正确分割UTF-8格式的单词
给preg_split添加u修饰符(启用UTF-8模式),调整正则表达式确保匹配包含变音符号的单词:
$MyText = "Die Straße enthält viele größere Schlaglöcher"; // 匹配Unicode字母+ß,分割非此类字符,过滤空元素 $Words = preg_split('/[^\p{L}ß]/u', $MyText, -1, PREG_SPLIT_NO_EMPTY);
这里\p{L}匹配任意Unicode字母,u修饰符让正则支持UTF-8,PREG_SPLIT_NO_EMPTY避免分割出空数组元素。
2. 安全反转每个UTF-8单词
不能用strrev(),改用多字节字符串处理函数逐字符拆分后反转:
$reversedWords = []; foreach ($Words as $word) { // 按UTF-8字符拆分字符串为数组 $chars = mb_str_split($word, 1, 'UTF-8'); // 反转数组并拼接成字符串 $reversedWords[] = implode('', array_reverse($chars)); } // 拼接反转后的单词得到最终句子 $result = implode(' ', $reversedWords); echo $result; // 输出:eiD eßartS tlähtne eleiv ereßörg rehcölgalhcS
完整代码示例
$MyText = "Die Straße enthält viele größere Schlaglöcher"; $Words = preg_split('/[^\p{L}ß]/u', $MyText, -1, PREG_SPLIT_NO_EMPTY); $reversedWords = []; foreach ($Words as $word) { $chars = mb_str_split($word, 1, 'UTF-8'); $reversedWords[] = implode('', array_reverse($chars)); } $result = implode(' ', $reversedWords); echo $result;
关键知识点
u修饰符:让PCRE正则支持UTF-8编码的字符匹配mb_str_split():按UTF-8字符拆分字符串,而非字节\p{L}:Unicode属性匹配,覆盖所有语言的字母字符,比手动枚举变音符号更通用
内容的提问来源于stack exchange,提问作者Michael Hutter
相关产品推荐
相关产品推荐

