2012-10-11 46 views
2

我有一个名为“Göran”我希望它被转换为“戈兰”,这意味着我需要unaccent特定的词。但我所尝试过的似乎没有unaccent所有的单词。如何在PHP中替换元音字符或Unaccent?

这是我已经习惯Unaccent代码:

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 

在那里工作的地方(正确的匹配):

Göran => Goran 
Jørgen Ole => Jorgen 
Jérôme => Jerome 

可能是什么意图儿子?怎么修?你有更好的方法来处理所有情况吗?

+1

在网上找到了,有用吗? http://snipplr.com/view/65596/unaccent-a-string/ – MarcDefiant

+0

停止! JârÃ'me不是一个名字,它的格式很糟糕。杰罗姆是正确的。 – nalply

回答

2

简短的回答

你有两个问题:

首先。这些名称不重音。他们格式不正确。

看来你有一个UTF-8文件,但使用ISO-8559-1与他们合作。例如,如果您告诉您的编辑器使用ISO-8859-1,并使用UTF-8将文本复制粘贴到浏览器的文本区域中。然后,您将格式不正确的名称保存在数据库中。我见过很多这样的问题来自复制粘贴。

如果名称格式正确,那么你可以解决你的第二个问题。他们是无辜的。已经有一个问题处理这样的:How to convert special characters to normal characters?

龙答案(着重于格式错误重音字母只)

为什么你已经得到Göran当你想Göran

让我们从Unicode开始:字母ö是Unicode LATIN SMALL LETTER O WITH DIAERESIS。它的Unicode代码点是F6十六进制或分别是246十进制。看到这个link到Unicode数据库。

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

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

那么,UTF-8对128以上的代码点有什么作用呢?代码点的编码可能性越来越大,因为它们变得越来越大。对于最多2047个代码点,两个字节就足够了。他们像这样编码:(see this bit schema

x xxxx xxxx xxxx => 110xxxxx 10xxxxxx 

让我们的编码小字母O与UTF-8 diaresis。这些位是:0 0000 1111 0110并被编码为11000011 10110110。这很好。

但是,这两个字节可能会被误解为两个有效的(!)ISO-8559-1字节。什么是11000011(C3十六进制)和10110110(B6十六进制)?我们来咨询an ISO-8859-1 table。 C3是大写字母A,而B6是段落符号。两个标志都是有效的,没有软件可以通过查看这些位来检测这种误解。

明确需要谁知道什么名字的样子。 Göran只是不是一个名字。名称中间有一个大写字母,而段落符号根本不是字母。可悲的是,这种误解并不止于此。因为所有字符都是有效的,所以它们可以被复制粘贴并重新渲染。在这个过程中,误解可以再次重复。我们用Göran来做到这一点。我们已经误解了一次,并得到了格式错误的Göran。字母大写A,代字符和段落符号以UTF-8 每个(!)呈现为两个字节,并被解释为四个字节的gobbledygook,如GÃÅ.ran

可怜的Jürgen!变音符号ü遭受了两次虐待,我们有JÃŒrgen

我们在这里和变音器有一个可怕的混乱。 OP甚至有可能从他的客户那里得到这些数据。这发生在我身上一次:我得到了混合数据:格式良好,在同一个文件中格式不正确一次,两次和三次。这非常令人沮丧。

+1

帮助我解决问题和解决问题。 @nalply – user1518659

+0

查看类型对PHP正在处理的内部数据没有影响。这是一个浏览器问题。 – ohmusama

+0

@ohmusama:不,那是不正确的。如果你用ISO-8859-1配置你的编辑器,那么你得到这些格式不好的名字。 – nalply