加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在PHP中使用半角假名计算日语多字节字符串的长度

发布时间:2020-12-13 13:22:28 所属栏目:PHP教程 来源:网络整理
导读:所以我有一个UTF-8编码的字符串,可以包含全宽汉字,全宽假名,半角假名,罗马字,数字或卡哇伊日语符号,如★或?. 如果我想要长度,我使用mb_strlen()并将它们中的每一个计为长度为1.这对大多数用途来说都没问题. 但是,我(有一个日本客户)被问到只计算半宽假名为0.
所以我有一个UTF-8编码的字符串,可以包含全宽汉字,全宽假名,半角假名,罗马字,数字或卡哇伊日语符号,如★或?.

如果我想要长度,我使用mb_strlen()并将它们中的每一个计为长度为1.这对大多数用途来说都没问题.

但是,我(有一个日本客户)被问到只计算半宽假名为0.5(为了文本字段的最大长度),因为显然这就是日本网站的做法.我这样做是使用mb_strwidth()将全宽计为2,将半宽计为1,然后我除以2.

然而,这种方法也将罗马字符计为1,所以像Chocアイス这样的东西会算作7 ..然后我除以2来计算汉字,我得到3.5.但我实际上想要5.5(4个半宽假名罗马吉1.5的4个).

//编辑:
更多信息:任何一个全长和半角的角色(甚至非假名)应该是1全宽,0.5是半宽.例如,像¥,3 @这样的字符(应该都是1,但像¥,3 @这样的字符(应该都是0.5)

// EXTRA EDIT:像☆和?这样的符号应为1,但mb_strwidth / 2方法将它们返回为0.5

是否有日本系统计算字符串长度的标准方法?
或者每个人都只是通过他们的字符串循环并计算与标准宽度规则不匹配的字符?

一种方法是将半宽片假名转换为全宽,并从原始长度中减去宽度差:
$raw = 'Choc???';
$full = mb_convert_kana($raw,'K');
$len = mb_strlen($raw) - (mb_strwidth($full) - mb_strwidth($raw))/2;
assert($len === 5.5);

但是,您确定要将基本拉丁字符视为全宽吗?确实存在基本拉丁字符的全宽种类 – 也就是说,Choc应该被认为与Choc相同吗?

通常,诸如“A”和“ア”之类的字符的宽度为1,但“A”和“ア”的宽度为2(这是mb_strwidth的宽度).我必须谨慎对待那个问题.

鉴于您的编辑,mb_strwidth(或mb_strwidth / 2)完全符合您的要求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读