【问题标题】:PHP - Strlen behaves very strange, the same things - different results, lol numbers?PHP - Strlen 的行为很奇怪,同样的事情 - 不同的结果,大声笑数字?
【发布时间】:2018-03-04 10:08:45
【问题描述】:

tresctresc_pelna

同类型,同内容

The same content876 个字符。

...AS data_dodania, p.data_modyfikacji, p.tresc, p.tresc_pelna, p.url, count(k.id)... 取自数据库

Echeon 到网站<?= strlen($post['tresc_pelna']).'----'.strlen($post['tresc']) ?>

你猜怎么着?

这是输出

876----3248

什么...?

我完全不知道这里发生了什么 xD。

请帮助大家:D

两个字段utf8_polish_ci 和完全相同的内容

<?= mb_strlen($post['tresc_pelna'], 'utf-8').'----'.mb_strlen($post['tresc'], 'utf-8') ?>

还是不好的结果。

tresc 超过 3 千... 什么... 怎么样?为什么?

【问题讨论】:

  • 这些字段的排序规则是什么?
  • @tkausl 都是utf8_polish_ci 并且两者的内容完全相同
  • 字符集不是手动更改的吗?即,他们都是utf8?
  • @tkausl all time utf-8
  • 当你回显两个 em 时,输出完全相同吗?

标签: php mysql unicode utf-8 strlen


【解决方案1】:

MySQL 有两个内置函数用于确定可变长度项的长度。一,计算不同的 unicode 字符,is called CHAR_LENGTH()。另一个计算八位字节(字节),为called LENGTH()

在 PHP 中,strlen() 计算八位字节,如 MySQL 的 LENGTH()。许多 unicode 字符串,尤其是那些以 utf8 编码的字符串,每个字符的八位字节数是可变的。您可以use grapheme_strlen() 来计算这些。

我发现有时使用SELECT HEX(unicode_column) 来找出 MySQL 中隐藏的内容会很有帮助。仅获取列数据会使您受制于您使用的 MySQL 客户端的字符渲染,并且可能会非常混乱。

也有可能您的数据库列中包含实体数据(例如字符串 é 而不是 Unicode 字符 é。如果该实体文本被发送到 Web 浏览器,它会呈现为字母。

【讨论】:

    【解决方案2】:

    LENGTHCHAR_LENGTH 之间的差异可以解释大多数欧洲文本的比率低于 1.2 倍。它不会解释 3248:876,接近 4 倍。

    也许这些是答案的一部分:

    • Htmlentities,例如ó,它占用 8 个字节来表示一个 2 字节的 utf8 字符。我们看不出其中一个是否有<,另一个是否有<
    • 格式化标签,例如<p>。同样,可能<p>

    不过,这还不足以解释近 4 倍。例如,一个简单的字母,如a,将是一个字节,不管它是如何编码的。请为 small 示例提供 HEX。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2012-08-09
      相关资源
      最近更新 更多