gpt4 book ai didi

php - 如何将一个 unicode 字符转换为第二个看起来完全相同的字符?

转载 作者:行者123 更新时间:2023-11-29 01:52:31 27 4
gpt4 key购买 nike

我会尽力解释我的问题。我在 MySQL 数据库中使用捷克语特殊字母,例如 ěščřžýáíé 等。我在数据库中搜索时遇到了问题,因为我正在搜索我知道在数据库中的确切单词,但没有找到结果。

后来我发现,不知何故我有两个“版本”的字符,它们看起来完全一样,但它们在 Unicode 中是不同的。请看example here . “á”和“á”看起来一样,应该被视为相同。所以现在我需要一种方法来将一个转换为另一个。最好使用 MySQL 或 PHP。

enter image description here

如上图所示,第一个字符实际上由“a”和“´”两个字符组成。第二个字符只是作为单个字符的“á”,这就是我想将第一个字符转换成的字符。

任何想法如何处理这个?当然,我说的是所有的捷克字符,不仅仅是“á”,我只是举个例子。

最佳答案

您描述的是 Unicode canonical equivalence .

我认为使用 utf8mb4_unicode_ci 整理可以为您解决这个问题。然而 documentation暗示它不会:

A combined character will be considered different from the same character written with a single unicode character in string comparisons, and the two characters are considered to have a different length (for example, as returned by the CHAR_LENGTH() function or in result set metadata).

然而,快速测试似乎表明这是不正确的:

mysql -u root -e "SELECT 'a<0301>' = 'á' COLLATE utf8mb4_unicode_ci;"
+-----------------------------------------+
| 'á' = 'á' COLLATE utf8mb4_unicode_ci |
+-----------------------------------------+
| 1 |
+-----------------------------------------+

令人困惑..虽然我想知道这句话是否只适用于前两句话的上下文:

Also, combining marks are not fully supported. This affects primarily Vietnamese, Yoruba, and some smaller languages such as Navajo.

所以无论如何,这可能对你有用。值得注意的是 utf8mb4_unicode_ci 会导致比较松散的匹配,例如áa 将被视为等同的:

mysql -u root -e "SELECT 'á' = 'a' COLLATE utf8mb4_unicode_ci;"
+---------------------------------------+
| 'á' = 'a' COLLATE utf8mb4_unicode_ci |
+---------------------------------------+
| 1 |
+---------------------------------------+

如果您希望对此有更好的控制,另一个选择是 normalize插入数据库之前的文本(需要 intl extention)。您是否愿意这样做取决于您对保持其绝对原始形式的兴趣。规范化过程保证了视觉上的等价性,因此应用起来应该是安全的。例如,如果您要规范化为组合形式(如果您关心的话,这将是最有效的存储方式):

<?php

$a = 'á'; // 0xC3 0xA1
$b = 'á'; // 0x61 0xCC 0x81

$ca = \Normalizer::normalize($a, \Normalizer::FORM_C);
$cb = \Normalizer::normalize($b, \Normalizer::FORM_C);

$da = \Normalizer::normalize($a, \Normalizer::FORM_D);
$db = \Normalizer::normalize($b, \Normalizer::FORM_D);

var_dump($a === $b); // FALSE
var_dump($a === $cb); // TRUE, $a is already composed
var_dump($ca === $cb); // TRUE, $a is unchanged by normalizer
var_dump($b === $da); // TRUE, $b is already decomposed
var_dump($db === $da); // TRUE, $b is unchanged by normalizer

关于php - 如何将一个 unicode 字符转换为第二个看起来完全相同的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37898108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com