【发布时间】:2011-08-03 17:35:07
【问题描述】:
所以我有一个 UTF-8 编码的字符串,它可以包含全角汉字、全角假名、半角假名、罗马字、数字或卡哇伊日文符号,如 ★ 或 ♥。
如果我想要长度,我使用mb_strlen(),它会将这些长度中的每一个都计为 1。这对于大多数用途来说都很好。
但是,我被(一位日本客户)要求仅将半角假名计为 0.5(出于文本字段的最大长度的目的),因为显然日本网站就是这样做的。我使用mb_strwidth() 执行此操作,它将全角计为 2,将半角计为 1,然后我只需除以 2。
但是,这种方法也将罗马字字符计为 1,因此 Chocアイス 之类的值将计为 7 .. 然后我将除以 2 来计算汉字,我会得到 3.5。但我实际上想要 5.5(罗马字 4 + 3 个半角假名 1.5)。
// 编辑:
更多信息:任何同时具有全角和半角的字符(甚至非假名)都应为全角 1 和半角 0.5。比如¥、3@(这样的字符都应该是1,但是¥,3@(这样的字符应该都是0.5
// 额外编辑:像 ☆ 和 ♥ 这样的符号应该是 1,但是 mb_strwidth/2 方法将它们返回为 0.5
日本系统是否有一种标准的方法来计算字符串长度? 还是每个人都只是遍历他们的字符串并计算不符合标准宽度规则的字符?
【问题讨论】:
-
我的自发想法是像往常一样使用
mb_strlen,并减去Unicode代码点FF61和FF9F之间的字符出现次数。稍后我可能会解决这个问题......
标签: php unicode character-encoding