如何在PHP中替换变音符号或Unaccent? - php

我有一个名称“Göran”,我希望将其转换为“ Goran”,这意味着我需要不区分特定单词。但是我尝试过的内容似乎并不能使所有单词都清晰。

这是我用于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

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

参考方案

简短答案

您有两个问题:

首先。这些名称没有重音。它们的格式不正确。

似乎您有一个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的代码点保持不变。带有小写字母的小写字母o仅保存为一个字节: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

让我们在UTF-8中用小写对小写字母o进行编码。这些位是: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

我们这里的变音符糟透了。 OP甚至有可能从他的客户那里获得此数据。这一次发生在我身上:我混合了数据:格式正确,格式错误一次,在同一文件中两次,三次。非常令人沮丧。

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP mysqli获取查询返回的第一行的值 - php

我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

更改默认的URL PHP - php

如何更改默认网址。例如www.example.com/index.php-> www.example.com现在,我要将其设置为www.example.com/test.php。我应该在php.ini中进行更改吗? 参考方案 假设您正在使用apache,则可以通过DirectoryIndex指令执行此操作。Check out the docs。