【发布时间】:2017-04-21 16:05:31
【问题描述】:
我在这里遇到了一个复杂的情况,我希望朝着正确的方向前进。
我需要允许 Basic Latin 搜索带回带有变音符号的结果。由于数据是用 HTML 而不是纯 ASCII 存储的,这使情况变得更加复杂。我一直在取得一些进展,但遇到了两个问题。
首先:我可以将数据部分转换成一些有用的东西,使用类似这样的东西:
$string = 'Véra';
$converted = html_entity_decode($string, ENT_COMPAT, 'UTF-8');
setlocale(LC_ALL, 'en_US.UTF8');
$translit = iconv('UTF-8', 'ASCII//TRANSLIT', $converted);
echo $translit;
这带来了这个结果:V'era 这是一个开始,但我真正需要的是Vera。我可以对结果字符串执行 preg_replace ,但是有没有办法在没有连字符的情况下将它带回来?这只是一个例子;数据库中有更多的变音符号(例如ñ 等等)。我觉得这个问题之前已经解决过(例如iconv returns strange results),但似乎没有列出任何解决方案。
更大的问题:我需要转换一个字符串,例如Vera,并能够用Véra 带回结果。以及Vera 的结果。但是,我相信我需要先解决问题 1,然后才能达到这一点。
我正在考虑类似 if ($translit) { return $string} 但我有点不确定如何处理这个问题。
感谢所有帮助。
编辑:我认为这可能会更容易直接在数据库中完成,但是我遇到了 DQL 的问题。我知道有一些方法可以使用存储过程在 SQL 中执行此操作,但是对数据库的访问权限有限,我愿意在 Doctrine 中提出任何处理此问题的建议
好的,所以也许我让这件事变得太难了
我所需要的只是一种在数据库中查找已被 HTML 编码的条目的方法,而无需使用特定编码但 也 没有变音符号本身。如果我搜索Jose,它应该会在数据库中显示任何标记为José
【问题讨论】:
-
您使用的是哪种类型的 SQL 数据库?
-
@ahmetson 这是一个mysql数据库,但是所有的连接都是通过Doctrine/DQL。我知道我可能可以通过存储过程来处理这个问题,但 Ops 似乎不喜欢这样。我可能不得不采用这种方法,但我想先探索其他选择
-
希望对您有所帮助 - forums.mysql.com/read.php?98,246527,246527
-
@AhmedGinani 谢谢,我确实看到了那个。它看起来确实很有希望;你知道这(或等效的)是否可以在 DQL 中工作?我可能无法在这个特定的数据库中存储过程。
-
它们是否总是命名实体并且总是
acute、grave或tilde?输入总是 ascii,或者也可以重音和/或实体化?
标签: php symfony utf-8 doctrine