一个字符与字节混合对齐的问题解决方案 -- 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就不能很好的解决了。

理解的关键概念:

1)字节

2)字符

3)显示列宽度

时间: 2024-07-30 17:58:16

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

由“Java中一个字符占两个字节”引起

起因 Java中一个字符占两个字节,这和C/C++稍有区别.在C/C++中我们可以通过sizeof运算符方便地知道某个变量类型或对象的大小,那在Java中又如何? 问题出现 Java为什么没有提供sizeof运算符? 要回答这个问题,我们可以从另一个角度来看,那就是为什么C/C++中提供sizeof运算符.这就让人忍不住想到C/C++和Java在内存管理上的区别. 在C中,内存分配和释放的任务交给了程序员,当我们尝试用malloc为某个对象分配一块堆内存时,一个无法逃避的问题是,这个即将被创建的

for循环每次取出一个字符(不是字节)

python3.5 for循环每次取出一个字符(不是字节) #!/usr/bin/env python # -*- coding:utf-8 -*- my_str = "我是哈哈" for i in my_str: my_bytes = bytes(i, 'utf-8') print(my_bytes) my_bytes = bytes(i, 'gbk') print(my_bytes) for i in my_str: my_bytes = bytes(i, 'utf-8') for

php中一个字符占用几个字节?

先看看字符与字节有什么区别: (一)"字节"的定义 字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位. (二)"字符"的定义 字符是指计算机中使用的文字和符号,比如1.2.3.A.B.C.~!·#¥%---*()--+.等等. 数字.字母等符号都是字符,字符只占一个字节,汉字占两个(UTF-8) 不同的编码格式下字符占用的字节时不同的: ANSI 中文字符2.英文字符1字节UTF-8 中文字符3.英文字符1字节Unic

字符串、字符、字节

1.strlen的原型 size_t strlen( char const *string); //size_t是一个无符号数 所以: if( strlen( x ) >= strlen( y ) ) //是可以的 if( strlen( x ) - strlen( y ) >= 0 ) //条件永真,因为无符号数相减还是无符号数,而无符号数永不为负. 2.strcpy(支持链式编程) char *strcpy( char *dst , char const *src); //目标区域如果不足

【c语言】把一个长整型给一个字符指针

// 把一个长整型给一个字符指针,修改的时候只修改了一个字节,结果会是一个很大的随机数 // 并不能通过这种方式给长整型赋值1 #include <stdio.h> void VarInit(unsigned char* pucArg) { *pucArg = 1; return; } int main() { unsigned long ulGlobal; VarInit((unsigned char*)&ulGlobal); printf("%lu\n", ul

【转载】字符,字节和编码

转自:http://www.regexlab.com/zh/encoding.htm 引言 "字符与编码"是一个被经常讨论的话题.即使这样,时常出现的乱码仍然困扰着大家.虽然我们有很多的办法可以用来消除乱码,但我们并不一定理解这些办法的内在原理.而有的乱码产生的原因,实际上由于底层代码本身有问题所导致的.因此,不仅是初学者会对字符编码感到模糊,有的底层开发人员同样对字符编码缺乏准确的理解.     1. 编码问题的由来,相关概念的理解 1.1 字符与编码的发展 从计算机对多国语言的支持

php中字符与字节的区别

字符: 字符是可使用多种不同字符方案或代码页来表示的抽象实体.例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字节序列.公共语言运行库使用 Unicode UTF-16(Unicode 转换格式,16 位编码形式)表示字符. php在UTF-8编码下,一个汉字占3个字符,gbk编码下只占2个字符. 字节(Byte): 字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位. 应用: 如果数据库中表为UTF8

求一个字符串的字节长度

编写一个方法 求一个字符串的字节长度 假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; } alert(GetBytes("你好,as"));

字符与字节

字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位.字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制,它是一个8位的二进制数,是一个很具体的存储空间. 字符:人们使用的记号,抽象意义上的一个符号. '1', '中', 'a', '$', '¥', …… 我们在记事本等一些文本工具中 写的都是字符,没有谁会去写字节(可以写字节,但是要用具特殊的编辑器),但是其实,我们的写的是字符,但磁盘上真实存储的是字节. Java 流在处理上分为字符流