如何替换PHP中的umlaut字符或非插入字符?

如何替换PHP中的umlaut字符或非插入字符?,php,character-encoding,diacritics,Php,Character Encoding,Diacritics,我有一个名字“GÃ∗ran”,我想把它转换成“Goran”,这意味着我需要取消指定的单词。但是我所尝试的并不是所有的话都是不正确的 这是我用来表示不同意的代码: private function Unaccent($string) { return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities(

我有一个名字“GÃ∗ran”,我想把它转换成“Goran”,这意味着我需要取消指定的单词。但是我所尝试的并不是所有的话都是不正确的

这是我用来表示不同意的代码:

private function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8'));
}
不起作用的地方(不正确的匹配):我的意思是它在右侧没有给出预期的结果

JÃŒrgen => Juergen
InÚs => Ines
工作地点(正确匹配):


原因可能是什么?如何修复?您是否有更好的方法来处理所有案件?

这可能就是您想要的

但是使用“utf-8”代替


简短回答

你有两个问题:

首先。这些名字没有重音。它们的格式很差

您似乎有一个UTF-8文件,但正在使用ISO-8559-1处理它们。例如,如果您告诉编辑器使用ISO-8859-1并使用UTF-8将文本复制粘贴到浏览器中的文本区域。然后将格式错误的名称保存到数据库中。我见过许多这样的问题是由复制粘贴引起的

如果名称格式正确,则可以解决第二个问题。不同意他们。关于这一点,已经存在一个问题:

长答案(只关注格式错误的重音字母)

当你想要Göran时,为什么你有Göran

让我们从Unicode开始:字母
ö
是Unicode
拉丁文小写字母O加上分音符
。其Unicode代码点为F6十六进制或分别为246十进制。请参见Unicode数据库

在ISO-8859-1中,0到255之间的代码点保持不变。带分隔符的小写字母o仅保存为一个字节:246

UTF-8和ISO-8859-1对代码点0到127(又称ASCII)的处理方式相同。它们保持原样,只保存为一个字节。它们在处理代码点128到255时有所不同。UTF-8可以对整个Unicode码点集进行编码,而ISO-8859-1只能处理前256个码点

那么,UTF-8如何处理128以上的代码点呢?当代码点越来越大时,有一组交错的编码可能性。对于2047以下的代码点,两个字节就足够了。它们的编码如下:()

让我们用UTF-8中的diaresis对小写字母o进行编码。位为:
0 0000 1111 0110
,并被编码为
11000011 10110110
。这很好

但是,这两个字节可能会被误解为两个有效的ISO-8559-1字节。什么是
11000011
(C3十六进制)和
10110110
(B6十六进制)?让我们商量一下。C3是大写字母A,B6是段落符号。这两种迹象都是有效的,任何软件都无法通过查看位来检测这种误解

它肯定需要知道名字的人
Gèran
不是一个名字。在名字的中间有一个大写字母,段落符号根本不是一个字母。可悲的是,这种误解并没有到此为止。因为所有字符都是有效的,所以可以对它们进行复制粘贴和重新渲染。在这个过程中,误解可能会再次出现。让我们用
Göran
来实现这一点。我们已经误解了一次,得到了一个格式不正确的
Gèran
。大写字母A、波浪号和段落符号在UTF-8中呈现为两个字节,每个字节都被解释为四个字节的gobbledygook,类似于
GÃÅ.ran

可怜的尤尔根!乌姆劳特人曾两次受到虐待,我们有一次遭到虐待


我们这里的乌姆洛特人搞得一团糟。甚至有可能OP从他的客户那里得到了这些数据。这种情况曾经发生在我身上:我在同一个文件中得到了混合数据:格式良好、格式不好、一次、两次、三次。这非常令人沮丧。

在网上找到这个,有用吗?停止Jérôme不是一个名字,它的格式很糟糕。Jérôme是正确的。请帮助我解决问题,并提供帮助@nalplyth查看类型对PHP处理的内部数据没有影响。这是浏览器的问题。@ohmusama:不,那不是真的。如果将编辑器配置为ISO-8859-1,则会得到这些格式不正确的名称。实际上,我正在做的事情是,我取消了单词的名称,并寻找与右侧单词的完全匹配,而我没有获得与我在问题中提到的单词的完全匹配@这个答案对手术没有帮助。
Göran => Goran
Jørgen Ole => Jorgen
Jérôme => Jerome
$text = iconv('utf-8', 'ascii//TRANSLIT', $text);
x xxxx xxxx xxxx => 110xxxxx 10xxxxxx