【问题标题】:How to strlen of a multi-language string如何strlen多语言字符串
【发布时间】:2012-02-13 07:02:29
【问题描述】:

我想得到 Shift-jis 和 Utf-8 的 strlen(),然后比较它们。 字符串可以混合“ああ12345678sdfdszzz”。我尝试使用 strlen 但它会产生不同的结果。 mb_strlen 也无济于事,因为这是一个混合字符串。

例如:

ああ12345678 >> strlen() = 24 chars
ああああああああああああああああ >> strlen() = 48 chars
ああああああああああああああああああ >> strlen() = 54 chars

似乎没有规则。那么计算 strlen 并在多语言中比较它们的最佳方法是什么

【问题讨论】:

  • 从您的示例来看,后两个示例中的 每个为 3 个字节(那么可能是 UTF-8)。但这与第一个示例并不完全相关。那么这些字符串究竟是如何构建的呢?
  • 那个角色是平假名。我在 ubuntu 上使用 ibus 键盘输入。我不知道为什么它是 3 个字节。我认为它必须是2个字节。我想知道这是否有一个真正的规则。

标签: php multilingual strlen


【解决方案1】:

strlen 只计算字节数,因此只对single-byte character encodings 有用;使用 mb_strlen 代替 multi-byte character encodings 可以计算实际字符数。

【讨论】:

  • 它是一个混合字符串,我应该将什么编码传递给 mb_strlen? utf8 还是 sjis?如果他们输入 5 种语言怎么办?
  • 那么字符编码是如何混合的呢?请注意,US-ASCII 是 UCS 的真子集,并且以 US-ASCII 和 UTF-8 精确编码。
  • 很抱歉,您会将什么编码传递给 mb_strlen?我的意思是mb_strlen的第二个参数。
【解决方案2】:

我会编写一个函数来检查特定编码的存在位置。

然后我会将字符串拆分为编码,执行 mb_strlen 并总结大小后缀。然后重复第二个字符串并进行比较。

我猜你明白我的意思;)

PS:使用mb_detect_encoding检测编码

mb_detect_encoding (see the comments for further ideas by the php community)

【讨论】:

    【解决方案3】:
    $field = $_POST['field'];
    $field_length = mb_strlen($field,'utf-8');
    

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多