【问题标题】:How to replace umlaut characters or Unaccent in PHP?如何在 PHP 中替换变音符号或 Unaccent?
【发布时间】:2012-10-11 06:18:46
【问题描述】:

我有一个名字“Göran”,我希望将其转换为“Goran”,这意味着我需要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

可能是什么原因?怎么修?你有更好的方法来处理所有的情况吗?

【问题讨论】:

标签: php character-encoding diacritics


【解决方案1】:

这可能就是你要找的东西

How to convert special characters to normal characters?

但改用“utf-8”。

$text = iconv('utf-8', 'ascii//TRANSLIT', $text);

http://us2.php.net/manual/en/function.iconv.php

【讨论】:

  • 这个答案不会帮助 OP。
【解决方案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 的代码点保持原样。带分音符号的小写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 each (!) 中呈现为两个字节,并被解释为 gobbledygook 的四个字节,类似于 GÃÅ.ran

可怜的尤尔根!变音符号ü 被虐待了两次,我们有JÃŒrgen

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

【讨论】:

  • 帮助我解决问题和不重音。 @nalply
  • 查看类型对 PHP 正在处理的内部数据没有影响。那是浏览器的问题。
  • @ohmusama:不,那不是真的。如果您使用 ISO-8859-1 配置您的编辑器,那么您会得到这些格式错误的名称。
  • 实际上我正在做的事情是我没有重音这个词并寻找与右侧单词的完全匹配,而我没有得到我在问题中提到的单词的完全匹配. @nalply
猜你喜欢
  • 2013-12-23
  • 2011-02-08
  • 2021-09-02
  • 2010-10-26
  • 2012-07-24
  • 2016-10-09
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多