如何逐个字母地处理带有变音符号的 UTF8 句子?

问题描述 投票:0回答:2

我有一个带有“Umlaute”(ä、ö、ü、ä、Ö、Ü、ß)的德语句子,想要逐个字母地处理它。假设我想倒着写每个单词。

我有:

"Die Straße enthält viele größere Schlaglöcher"

我想要什么:
"eiD eßartS tlähtne eleiv ereßörg rehcölgalhcS"

我尝试将句子分解为由单个单词组成的数组:

$MyText = "Die Straße enthält viele größere Schlaglöcher";
$Words = preg_split(@"/[^\wäöüÄÖÜß]/", $MyText);

但是当我尝试迭代 $Words 数组时,我遇到了一个问题,因为它包含由 2 个字节(UTF8)表示的字母(“ä”,“ö”,“ü”,...)并写入它们向后不起作用!

php split utf-8 diacritics
2个回答
0
投票

一种解决方案如下:

  1. 将 UTF8 字符串转换为 Unicode 字符串 (UTF16),其中每个字母由 2 个字节组成
  2. 将该字符串拆分为 2 字节块 => $LetterArray
  3. 用 $LetterArray 做一些事情
  4. 将更改后的数组合并为新字符串
  5. 将新字符串转换回 UTF8

这里有一个代码片段,说明如何做到这一点。

$Word = "enthält";
$Word_Unicode = mb_convert_encoding($Word, 'UTF-16LE', 'UTF-8');
$Letters = str_split($Word_Unicode, 2);
... Do something with the Array $Letters ...
$NewWord_Unicode = implode("", $Letters);
$NewWord = mb_convert_encoding($Word_Unicode, 'UTF-8', 'UTF-16LE');

0
投票

您可以在 preg_split 中使用

u
修饰符(不贪婪):

<?php
$MyText = "Die Straße enthält viele größere Schlaglöcher";
$Words = preg_split("/[^\wäöüÄÖÜß]/u", $MyText);

$reversed = array_map('strrev', $Words);

echo implode(' ', $reversed);

https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

© www.soinside.com 2019 - 2024. All rights reserved.