一个字符与字节混合对齐的问题解决方案 -- clwu

Posted 理货宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个字符与字节混合对齐的问题解决方案 -- clwu相关的知识,希望对你有一定的参考价值。

问题:项目中一个小工具,为了美观,引出一个需要把所有的 注释(c++ style)做列对齐(见方法三的图) 

 

方法一:

$_strlen = strlen($string);         // 对于有中文字符时,字数(字节数)偏大导致,列数要推前

 

方法二:

$_strlen = mb_strlen($string);    // 对于有中文字符时,字数(字符数)偏小导致,列数要推后

 

方法三:

$_strlen = ( strlen($string) + mb_strlen($string) / 2 );  // hack:一个中文字符占用 2 列的显示宽度,但一个utf8中文是 3个字节,用mb_strlen=1,strlen=3,(1+3)/2 = 2(单位:字节,正好是一个中文字符的显示宽度(2列))

 

方法三只是比较好的解决了这个问题,这里只是利用了 中文字符strlen=3,(1+3)/2 = 2的算术技巧,对于一些 emoji字符,strlen=2,(1+2)/2 = 1.5就不能很好的解决了。

 

方法四:

最好的办法是从根本上解决问题,mb_strwidth

$_strlen = mb_strwidth($string);

多字节字符通常是单字节字符的两倍宽度。

 

理解的关键概念:

1)字节

2)字符

3)显示列宽度

 

以上是关于一个字符与字节混合对齐的问题解决方案 -- clwu的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中:中英文混合的字符串按字节截取问题

js实现unicode码字符串与utf8字节数据互转

访问混合 8/16/32 位字的好方法

将 16 字节字符串与 SSE 进行比较

ASCIIUnicode和UTF-8编码的区别;中英文混合截取

混合字符串字符数统计