c 和php比较大小写,php-不区分大小写的字符串比较

如果您的字符串采用单字节编码,则很简单:

if(strtolower($var1) === strtolower($var2))

如果字符串是UTF-8,则必须考虑Unicode的复杂性:小写和大写不是双射函数,即,如果您具有小写字符,则将其转换为大写并进行转换 它返回小写字母,则可能不会以相同的代码点结尾(如果以大写字母开头,则同样适用)。

例如。

“İ”(Latin Small Ligature ff, U+FB00)是大写字母,小写字母“ i”(Latin Small Letter A (U+0061))–“ i”的大写字母是“ I”(Combining Diaeresis (U+0308))。

“ı”(Latin Small Ligature ff, U+FB00)是小写字符,大写字母形式为“ I”(Latin Small Letter A (U+0061))–“ I”的小写字母形式为“ i”(Combining Diaeresis (U+0308))

因此,即使Latin Small Ligature ff, U+FB00具有相同的大写字符,也将返回false。 如果您确实需要不区分大小写的字符串比较功能,则必须将其与大写和小写版本进行比较:

if(mb_strtolower($string1) === mb_strtolower($string2)

|| mb_strtoupper($string1) === mb_strtoupper($string2))

我从[https://codepoints.net]([https://dumps.codepoints.net)]对Unicode数据库进行了查询,发现180个代码点在使用时发现了不同的字符 小写字母的大写字母的小写字母,以及8个代码点,当我选择大写字母的字母的小写字母的大写字母时,我找到了一个不同的字符

但是,情况变得更糟:用户看到的同一个字素簇可能有多种编码方式:“ä”可能表示为Latin Small Ligature ff, U+FB00或Latin Small Letter A (U+0061)和Combining Diaeresis (U+0308) –如果以字节级别比较它们,则不会 返回true!

但是在Unicode中有一个解决方案:规范化! 有四种不同的形式:NFC,NFD,NFKC,NFKD。 对于字符串比较,NFC和NFD是等效的,而NFKC和NFKD是等效的。 我会选择NFKC,因为它比NFKD短,并且“ ff”(Latin Small Ligature ff, U+FB00)将转换为两个正常的“ f”(但2⁵也将扩展为25…)。

结果函数变为:

function mb_is_string_equal_ci($string1, $string2) {

$string1_normalized = Normalizer::normalize($string1, Normalizer::FORM_KC);

$string2_normalized = Normalizer::normalize($string2, Normalizer::FORM_KC);

return mb_strtolower($string1_normalized) === mb_strtolower($string2_normalized)

|| mb_strtoupper($string1_normalized) === mb_strtoupper($string2_normalized);

}

请注意:

您需要用于Normalizer的intl包

您应该通过首先检查它们是否相等来优化此功能^^

您可能要使用NFC而不是NFKC,因为NFKC消除了太多符合您口味的格式设置

您必须自己决定,是否真的需要所有这些复杂性,或者是否更喜欢此功能的简单变体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值